문제 링크
https://www.acmicpc.net/problem/1406
문제 정보
입력
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 M(1 ≤ M ≤ 500,000)이 주어진다. 셋째 줄부터 M개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.
출력
첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.
풀이
연결 리스트로 해결 할 수 있는 문제다. 연결 리스트는 커서를 이용하는 문제가 주로 나온다. 따라서 메모장 같은 문제들을 풀이할 때 용이하게 사용할 수 있다! 이 문제는 STL List를 이용해서 쉽게 풀이할 수 있는데 삭제 처리가 조금 혼란스러웠다. 내가 STL List를 정리한 글에서 erase 함수를 정확하지 않게 설명한 부분이 있어 이 문제를 풀면서 수정했다. STL List의 erase 함수는 cursor가 가리키는 값을 제거하고 그 다음 원소의 위치를 반환한다. 이를 정확하게 알고 있으면 풀이할 수 있다. 아래는 내가 작성한 STL List, 연결 리스트의 개념과 사용법이다.
[C++] 연결 리스트의 개념과 사용법
소스 코드
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
string str;
cin >> str;
list<char> L;
for (auto c : str) {
L.push_back(c);
}
auto cursor = L.end();
int m;
cin >> m;
while (m--) {
char cmd;
cin >> cmd;
if (cmd == 'P') {
char c;
cin >> c;
L.insert(cursor, c);
} else if (cmd == 'L') {
if (cursor != L.begin()) {
cursor--;
}
} else if (cmd =='D') {
if (cursor != L.end()) {
cursor++;
}
} else { // cmd == 'B'
if (cursor != L.begin()) {
cursor--;
cursor = L.erase(cursor);
}
}
}
for (auto c : L) {
cout << c;
}
return 0;
}