BOJ 1406 : 에디터 (C++)

김정욱·2020년 10월 9일
0

Algorithm - 문제

목록 보기
10/249

문제

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
profile
Developer & PhotoGrapher

0개의 댓글