728x90
문자를 계속해서 수정하므로 배열보다는 연결 리스트로 구현하는 것이 낫다고 생각했다.
리스트를 선언한 후 커서 위치를 설정했다.
위에서 커서 위치에 따른 iterator는 커서의 오른쪽에 위치한다.
예를 들어, abcd를 입력한 후 L을 입력하면 커서는 왼쪽으로 간다. 이때 iterator는 d를 가리키고 있다.
따라서 명령을 수행할 때 커서의 오른쪽에 있는 iterator를 기준으로 코드를 작성하면 된다.
명령어 'L'의 경우 커서가 문장의 맨 앞에 위치할 경우 continue를 했다. 커서가 문장의 맨 앞에 있으면 iterator는 editor.begin() 보다 한 칸 뒤에 있으므로 조건문을 위와 같이 설정했다.
나머지 명령어도 위와 같은 개념으로 구현하면 된다.
전체 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
// list 선언
list<char> editor;
// 문자열 선언
string str;
cin >> str;
// 에디터에 문자열 입력
for (int i = 0; i < str.length(); i++) {
editor.push_back(str[i]);
}
// 에디터 맨 뒤로 커서 위치 설정
// iterator는 커서의 오른쪽으로 설정
list<char>::iterator cursor = editor.end();
int M;
cin >> M;
for (int i = 0; i < M; i++) {
// 명령어 입력
char command;
cin >> command;
switch (command) {
case 'L':
if (cursor == editor.begin()++)
continue;
cursor--;
break;
case 'D':
if (cursor == editor.end())
continue;
cursor++;
break;
case 'B':
if (cursor == editor.begin()++)
continue;
else {
// 커서의 왼쪽에 있는 걸 지워야 하므로 현재 iterator의 한 칸 앞에 있는 걸 지운다.
cursor--;
editor.erase(cursor++);
}
break;
case 'P':
char text;
cin >> text;
// 해당 iterator의 앞에 삽입
editor.insert(cursor, text);
}
}
for (cursor = editor.begin(); cursor != editor.end(); cursor++) {
cout << *cursor;
}
cout << "\n";
return 0;
}
728x90
반응형
'코딩테스트 > c++' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 (3) | 2021.07.06 |
---|---|
[백준] 3273번 두 수의 합 (2) | 2021.06.30 |
백준 c++ 1697번 (2) | 2021.01.22 |
백준 c++ 2178번 (0) | 2021.01.19 |
백준 c++ 1926번 (0) | 2021.01.19 |