[ STL List 사용 ]
#include <iostream>
#include <list>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
list<char> L;
list<char>::iterator cursor;
string str,s;
char C,I;
int N;
cin >> str;
for(auto e : str)
{
L.push_back(e);
}
cursor = L.end();
cin >> N;
cin.ignore();
while(N--)
{
getline(cin,s);
C = s.at(0);
switch (C)
{
case 'L':
{
if(cursor != L.begin())
cursor--;
break;
}
case 'D':
{
if(cursor != L.end())
cursor++;
break;
}
case 'B':
{
if(cursor != L.begin())
cursor = L.erase(--cursor);
break;
}
case 'P':
{
I = s.at(2);
L.insert(cursor,I);
break;
}
}
}
for(auto a : L)
cout << a;
return 0;
}
- string 요소 참조 = s[인덱스] / s.at(인덱스)
- 공백 포함 입력할 때 = getline(cin, s)
- cin / getline() 같이 쓸 때에는 반드시 cin.ignore() 사용!
(입력 버퍼를 비워줘야 올바르게 입력이 된다)
[ 야매 List 사용 ]
#include <iostream>
#include <list>
using namespace std;
const int MX = 600001;
char dat[MX];
int pre[MX], nxt[MX];
int unused = 1;
int cursor;
void insert(int addr, int num){
dat[unused] = num;
pre[unused] = addr;
nxt[unused] = nxt[addr];
if(nxt[addr] != -1) pre[nxt[addr]] = unused;
nxt[addr] = unused;
unused++;
}
void erase(int addr){
if(nxt[addr] != -1) pre[nxt[addr]] = pre[addr];
nxt[pre[addr]] = nxt[addr];
}
void traverse(){
int cur = nxt[0];
while(cur != -1){
cout << dat[cur];
cur = nxt[cur];
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
fill(pre, pre+MX, -1);
fill(nxt, nxt+MX, -1);
string str,s;
char C,I;
int N;
cin >> str;
for(auto e : str)
{
insert(cursor++,e);
}
cin >> N;
cin.ignore();
while(N--)
{
getline(cin,s);
C = s.at(0);
switch (C)
{
case 'L':
{
if(pre[cursor] != -1)
cursor = pre[cursor];
break;
}
case 'D':
{
if(nxt[cursor] != -1)
cursor = nxt[cursor];
break;
}
case 'B':
{
if(cursor != 0)
{
erase(cursor);
cursor = pre[cursor];
}
break;
}
case 'P':
{
I = s.at(2);
insert(cursor,I);
cursor = nxt[cursor];
break;
}
}
}
traverse();
return 0;
}
- STL과 다르게 cursor을 단순히 ++ , -- 하면 안되고 다음 것과 연결 시켜줘야 한다!!
cursor = pre[cursor] / cursor = nxt[cursor]
- 처음일 경우 : pre[cursor] = -1
- 마지막일 경우 : nxt[cursor] = -1