Beakjoon 1406 에디터
in Algorithm
문제 링크 : https://www.acmicpc.net/problem/1406
나의 풀이
이 문제는 커서의 왼쪽과 오른쪽에 아래와 같이 스택이 존재한다고 생각하면 쉽게 문제를 해결할 수 있다.
예를 들어 초기 문자열이 “abc”로 주어진다면 다음과 같이 표현할 수 있다.
이 상황에서 명령어 ‘L’을 사용하여 커서를 왼쪽으로 옮기는 것은 왼쪽에 있는 스택의 top 값을 오른쪽 스택으로 넣어주는 것과 동일한 결과를 얻게된다.
명령어 ‘B’를 사용하여 커서 왼쪽에 문자를 삭제하는 것은 결국 왼쪽에 있는 스택의 top을 삭제하는 것과 같은 결과이기 때문에 왼쪽 스택에서 pop을 해준다.
명령어 ‘P’를 이용하여 ‘x’를 추가하는 경우 커서 왼쪽에 문자를 추가해야하기 때문에 왼쪽 스택에 문자 ‘x’를 추가해준다.
명령어 ‘D’를 사용하여 커서를 오른쪽으로 옮기는 것은 ‘L’명령어와 반대로 오른쪽 스택의 top을 왼쪽 스택의 넣어주는 것이다.
위와 같은 방식으로 명령어를 처리한 후 왼쪽과 오른쪽의 스택을 합쳐주면 최종적인 문자열을 완성할 수 있다.
풀이 코드 : 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];
}