[ 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