본문 바로가기
Problem Solving/BOJ

백준 1406번 에디터 - C++ 풀이

by 어멘드 2023. 8. 9.
반응형

 

1. 모든 쿼리는 커서를 기준으로 이루어진다.
2. 커서보다 왼쪽에 있는 문자들과 오른쪽에 있는 문자들을 각각 스택으로 관리한다.

 

1. 모든 쿼리는 커서를 기준으로 이루어진다.

 포인트는 모든 쿼리가 커서를 기준으로 이루어진다는 것이다.

 

2. 커서보다 왼쪽에 있는 문자들과 오른쪽에 있는 문자들을 각각 스택으로 관리한다.

 따라서 커서 직전, 직후 문자들만 쿼리 대상이다. 이에 적합한 자료구조인 스택을 사용한다. 커서보다 왼쪽에 있는 문자들을 한 스택에 모아두고, 커서보다 오른쪽에 있는 문자들을 또 다른 스택으로 묶어 관리한다. 접근 가능한 top이 커서 쪽이 되는 순서로 저장해야 한다.

 그러면 이제 모든 쿼리를 간단하게 구현할 수 있다. 왼쪽, 오른쪽 문자들이 담긴 스택을 각각 lst, rst라 하자.
 L: lst에서 하나를 뽑아 rst로 넘긴다.
 D: rst에서 하나를 뽑아 lst로 넘긴다.
 B: lst에서 하나를 뽑아 버린다.
 P: lst에 문자를 하나 푸쉬한다.

 


#include <iostream>
#include <algorithm>
#include <stack>

using namespace std;

stack<char> lst, rst;

void L() {
    if (lst.empty()) return;
    rst.push(lst.top());
    lst.pop();
}

void D() {
    if (rst.empty()) return;
    lst.push(rst.top());
    rst.pop();
}

void B() {
    if (lst.empty()) return;
    lst.pop();
}

void P(char c) {
    lst.push(c);
}

string calcString() {
    string ret = "";
    
    while (!lst.empty()) {
        rst.push(lst.top());
        lst.pop();
    }
    
    while (!rst.empty()) {
        ret += rst.top();
        rst.pop();
    }
    
    return ret;
}

int main() {
    string S;
    int M;
    
    cin >> S;
    for (auto c: S) {
        lst.push(c);
    }
    
    cin >> M;
    while (M--) {
        char cmd;
        cin >> cmd;
        
        if (cmd == 'L') L();
        else if (cmd == 'D') D();
        else if (cmd == 'B') B();
        else {
            char c;
            cin >> c;
            P(c);
        }
        
    }
    
    cout << calcString();
    
    return 0;
}

 

반응형

댓글