[BOJ] 에디터_1406 C++ 풀이

Updated:

문제

단순한 컴퓨터 상의 에디터를 생각하며 커서의 이동을 어떻게 구현할지를 고민해 보면 되는 문제였다.

접근 방법

처음에는 연결 리스트를 사용할까 생각했지만 스택을 s1과 s2 두개 사용하여 원소를 커서의 이동에 따라 두개의 스택에 옮겨 담는것이 구현하기 더 간편할 것이라 생각하였다.

먼저 입력된 문자열을 스택 s1에 담은 다음,

  • 커서 왼쪽으로 한칸 이동시 $($L) : s1의 마지막 원소$($top)를 s2로 옮겨준다.
  • 커서 오른쪽으로 한칸 이동시 $($D) : s2의 마지막 원소$($top)를 s1으로 옮겨준다.
  • 커서 왼쪽에 있는 원소를 삭제시 $($B) : s1의 마지막 원소를 삭제
  • 특정 문자를 커서 왼쪽에 삽입시 $($P) : s1에 해당 문자 삽입

구현

#include<iostream>
#include<string>
#include<stack>
using namespace std;

int main(void)
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int m, len; //명령어의 개수
    string str; 
    char cmd; //L, D, B, P
    char e;
    stack<char> s1, s2;

    cin>>str;
    cin>>m;
    len=str.length();

    for(int i=0; i<len; i++) s1.push(str[i]);

    while(m--)
    {
        cin>>cmd;
        if(cmd=='L' && !s1.empty()) // 커서 왼쪽으로 한칸 옮김
        {
            s2.push(s1.top());
            s1.pop();
        }

        if(cmd=='D' && !s2.empty()) // 커서 오른쪽으로 한칸 옮김
        {
            s1.push(s2.top());
            s2.pop();
        }

        if(cmd=='B' && !s1.empty()) s1.pop(); //커서 왼쪽 문자를 삭제함

        if(cmd=='P')
        {
            cin>>e;
            s1.push(e);
        }
    }

    while(!s1.empty()) // 스택은 LIFO이므로 출력을 순서대로 하기위해
    {
        s2.push(s1.top());
        s1.pop();
    }

    while(!s2.empty()) // 문자열 출력
    {
        cout<<s2.top();
        s2.pop();
    }
    return 0;
}

BOJ_에디터

Leave a comment