백준 algorithm
백준 1406 - 에디터
cosmohoo
2020. 2. 25. 21:56
반응형

stack을 사용하여 풀 수 있는 문제이다.
stack 두 개를 사용하여 커서를 표현 할 수 있다.
커서는 언제나 leftStack과 rightStack 사이에 있다.
L : leftStack.top을 rightStack으로 옮긴다.
D: rightStack.top을 leftStack으로 옮긴다.
B: leftStack.top을 삭제한다.
P : leftStack에 해당하는 char를 추가한다.
Print () : rightStack은 pop하는 순서대로 뽑아도 무방하다. 하지만 leftStack은 pop하는 반대 순서로 print해야 한다. 본인은 vector를 사용하여 간단하게 활용하였다. leftStack을 deque 를 사용하였다면 더 간단히 해결할 수 있을 듯 하다.
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
stack<char> leftStack, rightStack;
void Lcursor()
{
if(leftStack.empty())return;
else{
rightStack.push(leftStack.top());
leftStack.pop();
}
}
void Dcursor()
{
if(rightStack.empty())return;
else{
leftStack.push(rightStack.top());
rightStack.pop();
}
}
void Delete()
{
if(leftStack.empty())return;
else{
leftStack.pop();
}
}
void Add()
{
char addChar;
cin >> addChar;
leftStack.push(addChar);
}
void Print()
{
vector<char> leftStackVector;
while(!leftStack.empty())
{
leftStackVector.push_back(leftStack.top());
leftStack.pop();
}
for(int i=leftStackVector.size()-1; i>=0; --i)
{
cout<<leftStackVector[i];
}
while(!rightStack.empty())
{
cout<<rightStack.top();
rightStack.pop();
}
cout<<'\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
string first;
cin>>first;
int N;
cin>> N;
for(int i=0; i<first.length(); ++i)//pushing elements into leftStack
{
char c= first[i];
leftStack.push(c);
}
for(int j=0; j<N; ++j)
{
char c;
cin>> c;
if(c=='L')Lcursor();
else if(c=='D')Dcursor();
else if(c=='B')Delete();
else
{
Add();
}
}
Print(); //print all elements of stacks
return 0;
}
반응형