연결리스트, 스택, 덱을 이용해서 풀 수 있다.
1. 스택 이용
두 개의 스택을 이용한다.
커서의 왼쪽에 있는 문자열을 s1 스택에 저장. 커서의 오른쪽에 있는 문자열은 s2스택에 저장한다.
명령어 L과 D의 경우 커서가 움직일 때마다 문자열을 옮긴다.
#include <iostream>
#include <string>
#include <stack>
using namespace std;
stack<char> s1, s2;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string str;
cin >> str;
int n;
cin >> n;
for (auto &x : str)
{
s1.push(x);
}
while (n--)
{
char cmd;
cin >> cmd;
if (cmd == 'L')
{
if (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
else if (cmd == 'D')
{
if (!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
}
else if (cmd == 'B')
{
if (!s1.empty())
{
s1.pop();
}
}
else if (cmd == 'P')
{
char tmp;
cin >> tmp;
s1.push(tmp);
}
}
while (!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
while (!s2.empty())
{
cout << s2.top();
s2.pop();
}
return 0;
}
2. 연결리스트
list stl을 사용한다. double linked list와 동일하다.
#include <iostream>
#include <list>
#include <string>
using namespace std;
int n;
string str;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> str;
cin >> n;
list<char> lt(str.begin(), str.end());
auto cursor = lt.end();
for (int i = 0; i < n; i++)
{
char cmd;
cin >> cmd;
if (cmd == 'L')
{
if (cursor != lt.begin())
{
cursor--;
}
}
else if (cmd == 'D')
{
if (cursor != lt.end())
{
cursor++;
}
}
else if (cmd == 'B')
{
if (cursor != lt.begin())
{
cursor--;
cursor = lt.erase(cursor);
}
}
else if (cmd == 'P')
{
char tmp;
cin >> tmp;
lt.insert(cursor, tmp);
}
}
for (char x : lt)
{
cout << x;
}
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 4889] 안정적인 문자열 (0) | 2020.11.29 |
---|---|
[백준 5397] 키로거 (0) | 2020.11.29 |
[백준 10814] 나이순 정렬 (0) | 2020.11.28 |
[백준 1181] 단어 정렬 (0) | 2020.11.28 |
[백준 7785] 회사에 있는 사람 (0) | 2020.11.28 |
댓글