PS-Algorithm/Algorithm
[스택] BOJ-1406 에디터
su8y
2021. 11. 20. 23:03
# 풀이
스택을 생각하면 아주 간단한 구현으로 풀수있는 문제이다.
하나의 스택을 만들어 주고 그리고 다른 하나를 만들어준다.
abc를 넣는다고 가정을 해본다면가 될것이다. -> 그리고
c | |
b | |
a |
커서를 왼쪽으로 옮기면 첫번째 스택에서 값을 빼와서 두번째스택에 넣고 이와 동시에 입력을 하면 첫번째 스택에 들어가게된다.
e | |
b | |
a | c |
반대로 커서를 오른쪽으로 옮긴다고 치면
c | |
e | |
b | |
a |
이와같이 실행하여서 아래와 같은 값이 들어갔다고 치면
g | |
e | |
b | f |
a | c |
첫번째 스택에다가 두번째 스택의 값을 빼와서 abegfc가 되어서 완료가 되는 것이다.
# 실패
문제 코드에서 보면 반복문은 vStack.size() 만큼 반복을 하는데 동시에 vStack.pop_back()을 하여서 size가 줄어들어 문제가 생겼었다.
#include <vector>
#include <iostream>
#include <stack>
#include <string>
using namespace std;
vector<char> solve(vector<char> answers);
int main(){
string str;
cin >> str;
vector<char> v;
for(int i = 0; i < str.length(); i++){
v.push_back(str[i]);
}
solve(v);
return 0;
}
vector<char> solve(vector<char> answers){
vector<char> result;
vector<char> vStack;
char chr;
int n;
char chr2;
cin >> n;
cin.ignore();
for(int i = 0 ; i < n; i++){
cin >> chr;
cin.ignore();
switch (chr) {
case 'L':
if(!answers.empty()){
vStack.push_back(answers.back());
answers.pop_back();
// answers.erase(answers.end()-1);
}
break;
case 'D':
if(!vStack.empty()){
answers.push_back(vStack.back());
vStack.pop_back();
}
break;
case 'B':
if(!answers.empty()){
answers.pop_back();
}
break;
case 'P':
cin >> chr2;
cin.ignore();
answers.push_back(chr2);
break;
}
}
// 문제코드
// for(int i =0; i< vStack.size();i++){
// answers.push_back(vStack.back());
// vStack.pop_back();
// }
while(!vStack.empty()){
answers.push_back(vStack.back());
vStack.pop_back();
}
vector<char>::iterator it;
for(it = answers.begin(); it != answers.end(); it++){
cout << *it;
}
return result;
}
반응형