Beakjoon 1406 에디터

Baekjoon Online Judge

문제 링크 : https://www.acmicpc.net/problem/1406

나의 풀이

이 문제는 커서의 왼쪽과 오른쪽에 아래와 같이 스택이 존재한다고 생각하면 쉽게 문제를 해결할 수 있다.

stack

예를 들어 초기 문자열이 “abc”로 주어진다면 다음과 같이 표현할 수 있다.

abc

이 상황에서 명령어 ‘L’을 사용하여 커서를 왼쪽으로 옮기는 것은 왼쪽에 있는 스택의 top 값을 오른쪽 스택으로 넣어주는 것과 동일한 결과를 얻게된다.

L

명령어 ‘B’를 사용하여 커서 왼쪽에 문자를 삭제하는 것은 결국 왼쪽에 있는 스택의 top을 삭제하는 것과 같은 결과이기 때문에 왼쪽 스택에서 pop을 해준다.

B

명령어 ‘P’를 이용하여 ‘x’를 추가하는 경우 커서 왼쪽에 문자를 추가해야하기 때문에 왼쪽 스택에 문자 ‘x’를 추가해준다.

P_x

명령어 ‘D’를 사용하여 커서를 오른쪽으로 옮기는 것은 ‘L’명령어와 반대로 오른쪽 스택의 top을 왼쪽 스택의 넣어주는 것이다.

D

위와 같은 방식으로 명령어를 처리한 후 왼쪽과 오른쪽의 스택을 합쳐주면 최종적인 문자열을 완성할 수 있다.

풀이 코드 : 1406 에디터

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<char> str_left;
vector<char> str_right;
void solution(char cmd){
    if(cmd == 'P'){
        char ch;
        cin>>ch;
        str_left.push_back(ch);
    }
    else if(cmd == 'L'){
        if(!str_left.empty()){
            str_right.push_back(str_left.back());
            str_left.pop_back();
        } 
    }
    else if(cmd == 'D'){
        if(!str_right.empty()){
            str_left.push_back(str_right.back());
            str_right.pop_back();
        }
    }
    else if(cmd == 'B'){
        if(!str_left.empty()){
            str_left.pop_back();
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    string temp_str;
    cin>>temp_str;

    for(int i=0;i<temp_str.size();i++){
        str_left.push_back(temp_str[i]);
    }

    int M;
    cin>>M;
    for(int m=0;m<M;m++){
        char cmd;
        cin>>cmd;
        solution(cmd);
    }

    for(int i=0;i<str_left.size();i++)
        cout<<str_left[i];
    for(int i=str_right.size()-1;i>=0;i--)
        cout<<str_right[i];
}

채점결과

49993


© 2020. All rights reserved.

Powered by Hydejack v8.4.0