처음엔 연결 리스트 자체를 직접 구현하려고 하였으나, STL 에 만들어진 좋은 자료구조가 있어서 활용하였다.
현재 위치는 이터레이터로써 가지고 있는데, 해당 원소의 앞으로 생각하냐 뒤로 생각하냐에 따라서 구현이 달라진다.
뒤로 놓을 경우 이런저런 귀찮은 조건들을 설정해주어야 했기 때문에, 깔끔하게 앞으로 생각하여 풀었다.
다른분들의 풀이를 보니, 스택 등을 이용해서 풀면 더 시간적으로 빠르게 동작할 수 있는 듯 하다.
양방향 연결 리스트 구현은 [자료구조] 카테고리에서 자바로 해보았다.
#include <iostream>
#include <list>
using namespace std;
int M;
string start;
char input, value;
list<char> dll;
list<char>::iterator cur; // 커서 위치는, 이터레이터의 원소와 앞 원소 사이 위치
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> start;
int N = start.size();
for(int i = 0 ; i < N ; i++)
{
dll.push_back(start[i]); // 처음 입력받는 문자열을 다 넣어준 뒤
}
cur = dll.end(); // 커서를 맨 뒤로 옮김
cin >> M;
for(int i = 0 ; i < M ; i++)
{
cin >> input;
switch (input)
{
case 'L':
if(cur != dll.begin()) cur--; // 맨 앞이 아닐 경우 커서 왼쪽으로 이동
break;
case 'D':
if(cur != dll.end()) cur++; // 맨 뒤가 아닐 경우 커서 오른쪽으로 이동
break;
case 'B':
if(cur != dll.begin()) cur = dll.erase(--cur); // 맨 앞이 아닐 경우, 앞의 원소 삭제 후 위치 갱신
break;
default:
cin >> value;
dll.insert(cur, value); // 현재 위치에 원소 추가
break;
}
}
for(cur = dll.begin() ; cur != dll.end() ; cur++)
{
cout << *cur;
}
cout << endl;
}