처음에는 stack으로 분류가 되어있어서 stack 문제인 줄 알았지만, 시간 복잡도 때문에 linked list를 사용해야 함을 알았다. 이 문제가 어이가 없었던 부분은 다름이 아니라, list 의 erase 함수에서
it = erase(--it);
erase(--it);
it++;
처음에 아래와 같이 작성해서 틀렸다는 것이다. 이는 명백히 내가 잘못한 것이 맞다. 이유는 ideone.com에서 컴파일을 해보았을 때 컴파일 에러가 뜨기 때문이다. 일단 원리 자체를 정확히 이해하지는 못했지만, 일단은 예쁘게 코딩해야겠다는 생각이 들었다. 저 부분또한 어찌보면 부자연스러운 코드이기 때문이다.
이유를 아시는 분 있다면 댓글을 부탁드립니다. ㅎㅎㅠ
// 5397번 키로거
#include <iostream>
#include <list>
#include <string>
using namespace std;
int T;
string str;
list<char> li;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); // cin 실행속도 향상
cin >> T;
while (T--) {
// input
cin >> str;
list<char>::iterator it;
// initialize
it = li.begin();
for (int i = 0; i < str.length(); i++) {
char temp = str[i];
if (temp == '<') {
if (it == li.begin()) {
continue;
} else {
it--;
}
} else if (temp == '>') {
if (it == li.end()) {
continue;
} else {
it++;
}
} else if (temp == '-') {
if (it == li.begin()) {
continue;
} else {
it = li.erase(--it);
}
} else {
li.insert(it, temp);
}
}
for (it = li.begin(); it != li.end(); it++) {
cout << *it;
}
cout << endl;
li.clear();
}
return 0;
}