알고리즘/백준

[백준/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