백준 5397 키로거

Problem : 키로거

유형 : 연결 리스트


문제 해석

  • 입력받은 문자열을 토대로, 비밀번호를 찾아라.

해결 전략

  • 중간에 삽입과, 삭제가 잦다.
    • 리스트 자료구조를 이용하여 해결한다.

구현

  • 주어진 조건에 맞춰서 그대로 구현한다.
  • 이동할수 없는곳과 삭제할수 없는것을 삭제하려는 경우를 주의한다.

주의할 점

  • insert(iterator, value) 이후 iterator는 삽입된곳 뒤를 가리키게 된다.
  • iterator = insert(iterator, value) 를 하면 리턴값이 삽입한 위치이 되어 의도하지 않은 결과가 나온다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>

using namespace std;

int n;
string cmd;

void solve() {
    list<char> li;
    auto cursor = li.begin();
    
    for (const char &c : cmd) {
        if (c == '<') {
            if(cursor != li.begin()) cursor--;
        }
        else if (c == '>') {
            if(cursor != li.end()) cursor++;
        }
            
        else if (c == '-') {
            if (cursor != li.begin()) cursor = li.erase(--cursor);
        }
        else li.insert(cursor, c);
    }
    for (const char p : li) {
        cout << p;
    }
    cout << "\n";
}

void input() {
    int t;  cin >> t;
    while (t--) {
        cin >> cmd;
        solve();
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);  cout.tie(NULL);
    //freopen("input.txt", "r", stdin);

    input();

    return 0;
}

피드백

  • 반복자 erase, insert시 항상 주의하자.