5497번 키로거

5497번 키로거 백준 알고리즘 문제

처음에는 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;
}