알고리즘/문제 풀이

1406번: 에디터

Themion 2021. 12. 8. 10:28

https://www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

문자열을 스택을 이용해 편집하는 문제이다. 스택을 두 개 선언하고 모든 문자열을 스택 하나에 저장한 뒤, 커서의 이동을 스택 간의 성분 이동으로, 문자 입력과 제거는 스택에 push / pop하는 것으로 구현 가능하다.

스택을 이용한 문자열에서 명령 L은 그림과 같이 이루어진다.

#include <iostream>
#include <stack>

using namespace std;

// f, b: 커서를 기준으로 각각 문자열의 앞, 뒤를 저장할 스택
stack<char> f, b;

// 명령 c를 분석해 그에 맞는 작업을 실행
void command(char c) {
    switch (c) {
    // 명령이 L이라면 커서를 오른쪽으로 이동
    case ('L'):
        // f가 비어있지 않을 때 f의 top을 b로 옮긴다
        if (!f.empty()) {
            b.push(f.top());
            f.pop();
        }
        break;
    // 명령이 D라면 커서를 왼쪽으로 이동
    case ('D'):
        // b가 비어있지 않을 때 b의 top을 f로 옮긴다
        if (!b.empty()) {
            f.push(b.top());
            b.pop();
        }
        break;
    // 명령이 B라면 커서 앞의 글자를 제거
    case ('B'):
        // f에 값이 있는 경우 f의 back을 pop한다
        if (!f.empty()) f.pop();
        break;
    // 명령이 P라면
    case ('P'):
        // 문자열에 넣을 문자를 입력받아 f의 뒤에 push한다
        cin >> c;
        f.push(c);
        break;
    }
    // 개행 문자를 입력받아 버린다
    cin.get();
}

int main() {
    // 입출력 속도 향상
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    // 입력에 사용할 버퍼
    char buf;
    // 문자열에 가할 명령의 수
    int T;

    // 해당 문자열이 공백이 아니라면 f에 push한다
    // 이 과정을 buf에 \n이 들어올 때까지 반복한다
    while ((buf = cin.get()) != '\n') f.push(buf);
    // 문자열에 가할 명령의 수를 입력받는다
    cin >> T;
    cin.get();

    // 각 명령에 대해 명령에 맞는 작업을 실행
    while (T--) command(cin.get());

    // f를 b에 모두 저장한 뒤
    while (!f.empty()) {
        b.push(f.top());
        f.pop();
    }

    // b를 차례로 출력
    while (!b.empty()) {
        cout << b.top();
        b.pop();
    }

    // 모든 동작을 끝마쳤으므로 개행 문자를 출력해 출력을 마친다
    cout << '\n';

    return 0;
}