알고리즘/백준
[백준/c++] 1406번: 에디터
녕이
2022. 5. 12. 16:38
728x90
https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
커서 -> 맨 앞, 맨뒤, 중간
L: 커서를 왼쪽으로 이동 (맨 앞에 있으면 무시)
D: 커서를 오른쪽으로 이동 (맨 뒤에 있으면 무시)
B: 커서 왼쪽에 있는 문자 삭제 (맨 앞에 있으면 무시)
P $: $라는 문자를 커서 왼쪽에 추가
stack 배열로는 중간 삽입을 할 수 없으니까 그럼 연결 리스트를 사용해야 하나 싶어서 하나하나 구현할 생각에 질려있었는데,,
다른 사람의 코드를 보니까 stack STL로 left, right 두 개를 만들어서 커서가 왼쪽으로 이동하면 left 스택의 원소를 right 스택으로 이동하는 방식을 사용했다..!! 신기하군요. 역시.. 천재들이 너무 만하...
여러 방식으로 할 수 있다는 것을 깨달은.. 좋은 문제였다..!
#include <iostream>
#include <stack>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
string str;
stack<char> left; //커서의 왼쪽
stack<char> right; //커서의 오른쪽
int n;
cin >> str >> n;
for(int i=0; i<str.size(); i++) left.push(str[i]);
while(n--){
char com;
cin >> com;
if(com == 'L'){
//만약에 커서가 맨 앞에 있으면 무시 -> left 스택에 아무것도 없으면 패스
if(left.empty()) continue;
//왼쪽 top에 잇는게 오른쪽 스택으로 이동
right.push(left.top());
left.pop();
}else if(com == 'D'){
if(right.empty()) continue;
left.push(right.top());
right.pop();
}else if(com == 'B'){
if(left.empty()) continue;
left.pop();
}else if(com == 'P'){
char al;
cin >> al;
left.push(al);
}
}
while(!left.empty()){
right.push(left.top());
left.pop();
}
while(!right.empty()){
cout << right.top();
right.pop();
}
cout << '\n';
return 0;
}
728x90