[BOJ 백준] 1406번 에디터 / C++
문제
문제를 보시려면 링크를 클릭해주세요.
풀이
연결 리스트를 사용하기 위해 STL list를 이용해 풀었습니다.
명령어 B의 경우, 왼쪽 문자를 삭제하기 위해 커서를 왼쪽으로 이동하여 삭제합니다.
이 때, 커서 오른쪽에 오는 문자는 그대로라고 했기 때문에 커서의 위치는 삭제 후에도 변함이 없어야 하므로 커서의 위치를 오른쪽으로 재이동 시켜줘야합니다.
커서를 그냥 증가시켜줘도 되지만 erase() 함수는 삭제한 원소의 다음 원소를 가리키는 iterator를 반환하기에, 아래 코드에서는 반환값을 커서에 다시 넣어줬습니다.
소스 코드
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
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <list>
#include <string>
using namespace std;
int main(int argc, char**argv) {
ios::sync_with_stdio(0);
cin.tie(0);
string str;
list<char> L;
cin >> str;
for(int i=0; i<str.size(); i++){
L.push_back(str.at(i));
}
int N;
list<char>::iterator cur = L.end();
cin >> N;
for(int i=0; i<N; i++){
char c;
cin >> c;
if(c=='L'){
if(cur!=L.begin()) cur--;
}
else if(c=='D'){
if(cur!=L.end()) cur++;
}
else if(c=='B'){
if(cur!=L.begin())
cur = L.erase(--cur);
}
else if(c=='P'){
char s;
cin >> s;
L.insert(cur,s);
}
}
for(list<char>::iterator it=L.begin(); it!=L.end(); it++){
cout << *it;
}
return 0;
}
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.