- 1번 라인(init 문자열), 2번 라인(command 횟수)를 입력받도록 한다.
- 나머지 라인에 대해서 command 횟수 만큼 반복하여 주어진 명령을 수행하도록 하자.
- 2번 라인 이후의 내용을 각각 파싱 해줄떄 어떻게 해줘야 하지?
- 현재 커서위치에 따라 문자열을 어떻게 지워야 하나?
- getline을 통해서 string으로 전체를 읽고 cmd[0], cmd[2]와 같이 구분하여 필요한 command에서 cmd[2]를 추가하는 방식으로 해결.
- 현재 위치에 대한 cursor는 관리하고 있었으나 지우는 command에서 1을 감소하고 .erase를 통해서 지우면 문제 해결
ex) 커서의 위치 3일때 init이 abc라고하면
c를 지워야하는데 3으로 지우면 abc 다음인 아무것도 공백을 지우므로
커서의 위치를 -1 감소 시키고 현재 위치의 커서를 지움
- 문제를 너무 어렵게 생각한다.
- 자료구조를 잘 사용할줄 모른다.
#include <bits/stdc++.h>
using namespace std;
int main(void) {
// 입출력 분리해서 빠르게 동작하도록
ios::sync_with_stdio(0);
cin.tie(0);
// 처음 문자열 입력받음.
string init;
cin >> init;
// 입력할 문자열 리스트 선언
list<char> L;
// 초기에 입력받은 문자들 for each로 리스트에 추가
for (auto c : init)
L.push_back(c);
// 현재 커서 위치를 맨뒤로 옮김.
auto cursor = L.end();
// 몇번의 명령어를 입력할지 입력받음.
int Q;
cin >> Q;
// 입력받을 명령어 문자열
string tmp;
getline(cin, tmp); // 줄바꿈 한 개 제거
while (Q--) { // Q번 반복
string op;
// 공백까지 입력받도록.
getline(cin, op);
if (op[0] == 'P') {
L.insert(cursor, op[2]);
} else if (op[0] == 'L') {
if (cursor != L.begin())
cursor--;
} else if (op[0] == 'D') {
if (cursor != L.end())
cursor++;
} else {
// 현재 커서가 시작 위치가 아니라면
if (cursor != L.begin()) {
// 커서의 위치 ex) 3일때 init이 abc라고하면
// [0][1][2][3]
// c를 지워야하는데 3으로 지우면 a b c 다음인 아무것도 아닌것을 지우므로
// 커서의 위치를 -1 감소 시키고
cursor--;
// 현재 위치의 커서를 지움.
cursor = L.erase(cursor);
}
}
}
for (auto c : L)
cout << c;
}