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 |
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 9095번: 1,2,3 더하기 (C++) (0) | 2019.09.19 |
---|---|
백준 1600번: 말이 되고픈 원숭이 (C++) (0) | 2019.09.06 |
백준 1987번: 알파벳 (c++) (0) | 2019.09.01 |
백준 12851번: 숨바꼭질2 (C++) (0) | 2019.08.31 |
백준 9019번: DSLR (C++) (0) | 2019.08.30 |