BOJ 1406 : 에디터 (C++)
문제
Code
[ 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
Author And Source
이 문제에 관하여(BOJ 1406 : 에디터 (C++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@neity16/BOJ-1406-에디터-C
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
[ 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
Author And Source
이 문제에 관하여(BOJ 1406 : 에디터 (C++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@neity16/BOJ-1406-에디터-C저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)