https://www.acmicpc.net/problem/5397



여러가지 풀이가 가능하겠지만, 링크드리스트를 활용해서 풀었다.



STL list의 여러가지 함수들을 자유롭게 활용할 줄 안다면 무리 없이 풀리는 문제이다.



커서의 초점을 삽입에 맞추느냐 삭제에 맞추느냐에 따라서 풀이가 약간씩은 달라질 수 있겠다.



즉  a b c 이러한 문자열 상황에서, 커서가 a에 있는 상태에서, 삽입 명령이 들어오면 a 왼편에 새로운 문자가 들어가야 하고


삭제 명령이 들어오면 아무런 변화도 일어나지 않아야 한다.


하지만 실제 구현을 할 때, iterator를 .begin()에 두고 삭제를 하게 되면 a가 삭제될 것이다.


즉 삭제의 경우에는, 커서의 왼편에 있는 값을 삭제해주도록 구현을 해야한다.



정리하면, iterator의 위치를 insert의 인자로 활용하는 경우에, 삭제를 구현하려면 한 칸 왼쪽의 값을 삭제해주어야 한다.




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
#include<iostream>
#include<list>
#include<string>
using namespace std;
//list insert할 때, itr이 가리키는 왼편에 새로운 수 삽입, itr은 원래 가리키던 수를 가리킴
//erase: itr이 가리키던 수 지워버리고, 우측에 있는 수를 가리킴
int main(void) {
    int T;
    cin >> T;
    while (T--) {
        string str;
        cin >> str;
        list<char> ans;
 
        
        list<char>::iterator itr = ans.end(); //커서의 초기 위치
        
        for (int i = 0; i < str.length(); i++) {
            
            if (str[i] == '<') {
                if (itr == ans.begin()) continue;
                itr--;
            }
            else if (str[i] == '>') {
                if (itr == ans.end()) continue;
                itr++;
            }
            else if (str[i] == '-') {
                if (itr == ans.begin()) continue;
                itr = ans.erase(--itr); //erase 시에는 반환되는 itr을 받아서 갱신해줘야 한다
            }
            else {
                ans.insert(itr, str[i]);
            }
        }
 
        //print
        for (auto it = ans.begin(); it != ans.end(); it++
            cout << *it;
        cout << '\n';
        ans.clear();
    }
    return 0;
}
 
 
cs

 

+ Recent posts