• toc {:toc}

๋ฌธ์ œ

ํ•œ ์ค„๋กœ ๋œ ๊ฐ„๋‹จํ•œ ์—๋””ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด ํŽธ์ง‘๊ธฐ๋Š” ์˜์–ด ์†Œ๋ฌธ์ž๋งŒ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ์ง‘๊ธฐ๋กœ, ์ตœ๋Œ€ 600,000 ๊ธ€์ž๊นŒ์ง€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ํŽธ์ง‘๊ธฐ์—๋Š” โ€™ ์ปค์„œ โ€™ ๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋Š”๋ฐ, ์ปค์„œ๋Š” ๋ฌธ์žฅ์˜ ๋งจ ์•ž (์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž์˜ ์™ผ์ชฝ), ๋ฌธ์žฅ์˜ ๋งจ ๋’ค (๋งˆ์ง€๋ง‰ ๋ฌธ์ž์˜

์˜ค๋ฅธ์ชฝ), ๋˜๋Š” ๋ฌธ์žฅ ์ค‘๊ฐ„ ์ž„์˜์˜ ๊ณณ (๋ชจ๋“  ์—ฐ์†๋œ ๋‘ ๋ฌธ์ž ์‚ฌ์ด) ์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ๊ธธ์ด๊ฐ€ L ์ธ ๋ฌธ์ž์—ด์ด ํ˜„์žฌ ํŽธ์ง‘๊ธฐ์—

์ž…๋ ฅ๋˜์–ด ์žˆ์œผ๋ฉด, ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ L+1 ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์ด ํŽธ์ง‘๊ธฐ๊ฐ€ ์ง€์›ํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

L์ปค์„œ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊น€ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ์•ž์ด๋ฉด ๋ฌด์‹œ๋จ)
D์ปค์„œ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์˜ฎ๊น€ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ๋’ค์ด๋ฉด ๋ฌด์‹œ๋จ)
B์ปค์„œ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•จ (์ปค์„œ๊ฐ€ ๋ฌธ์žฅ์˜ ๋งจ ์•ž์ด๋ฉด ๋ฌด์‹œ๋จ)
์‚ญ์ œ๋กœ ์ธํ•ด ์ปค์„œ๋Š” ํ•œ ์นธ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์ปค์„œ์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋˜ ๋ฌธ์ž๋Š” ๊ทธ๋Œ€๋กœ์ž„
P $$๋ผ๋Š” ๋ฌธ์ž๋ฅผ ์ปค์„œ ์™ผ์ชฝ์— ์ถ”๊ฐ€ํ•จ

์ดˆ๊ธฐ์— ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง€๊ณ , ๊ทธ ์ดํ›„ ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด๊ฐ€ ์ฐจ๋ก€๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„

ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ๋ช…๋ น์–ด๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ์ „์— ์ปค์„œ๋Š” ๋ฌธ์žฅ์˜ ๋งจ ๋’ค์— ์œ„์น˜ํ•˜๊ณ 

์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์—๋Š” ์ดˆ๊ธฐ์— ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ž์—ด์€ ๊ธธ์ด๊ฐ€ N ์ด๊ณ , ์˜์–ด ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ

์žˆ์œผ๋ฉฐ, ๊ธธ์ด๋Š” 100,000 ์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ž…๋ ฅํ•  ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ M(1 โ‰ค Mย โ‰ค

500,000) ์ด ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ M ๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ์ž…๋ ฅํ•  ๋ช…๋ น์–ด๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋ช…๋ น์–ด๋Š” ์œ„์˜ ๋„ค ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜์˜

ํ˜•ํƒœ๋กœ๋งŒ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„ ํŽธ์ง‘๊ธฐ์— ์ž…๋ ฅ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ถœ์ฒ˜:https://www.acmicpc.net/problem/1406

ํ’€์ด

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์•ผ๋งค ๊ตฌํ˜„๋ฐฉ๋ฒ• ํ™•์‹คํ•˜๊ฒŒ ์ตํ˜€๋‘๊ธฐ โ‡’ 3, 4 ๋ฒˆ ๋” ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

์•ผ๋งค ํ’€์ด๋ฒ•

// ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ
#include <bits/stdc++.h>
 
using namespace std;
 
const int MX = 1000005;
char dat[MX];
int pre[MX], nxt[MX];
int unused = 1;
 
void insert(int addr, char data){
    dat[unused] = data;
    pre[unused] = addr;
    nxt[unused] = nxt[addr];
    if(nxt[addr] != -1) pre[nxt[addr]] = unused;
    nxt[addr] = unused;
    unused++;
}
 
void erase(int addr){
    nxt[pre[addr]] = nxt[addr];
    if(nxt[addr] != -1) pre[nxt[addr]] = pre[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;
    int N, M, cursor=0;
    char inp;
    cin >> str >> M;
    N = str.size();     // ๋ฌธ์ž์—ด์˜ ๊ธธ์ด
    for(auto elem : str){       // ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ์ž๋ฃŒํ™”
        insert(cursor, elem);
        cursor++;
    }
 
    for (int i = 0; i < M; i++)             // ์กฐ์ž‘ํ‚ค๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ
    {
        cin >> inp;
        switch (inp){
            case 'L':
                if(pre[cursor] != -1) cursor = pre[cursor];
                break;
            case 'D':
                if(nxt[cursor] != -1) cursor = nxt[cursor];
                break;
            case 'B':
                if(pre[cursor] != -1){          // ์ปค์„œ์˜ ์ฐจ์ด dat์ผ ๋•Œ pre์ผ ๋•Œ
                    erase(cursor);              // dat์ผ ๋•Œ๋กœ ํ•˜๋ฉด ์ปค์„œ๊ฐ€ ํ•˜๋‚˜ ๋” ์ด์ „์œผ๋กœ ์œ„์น˜ํ•˜๊ฒŒ ๋จ
                    cursor = pre[cursor];
                }
                
                break;
            case 'P':
                char c1;
                cin >> c1;
                insert(cursor, c1);
                cursor = nxt[cursor];
                break;
        }
    
    }
    
    traverse();
 
    return 0;
}

STL List ์‚ฌ์šฉ

ํ˜„์žฌ ๋ฌธ์ž์—ด์ด ABCD ์ผ ๋•Œ

(1) A (2) B (3) C (4) D (5)

L.end() โ‡’ 5 ๋ฒˆ

L.begin() โ‡’ 1 ๋ฒˆ

L.erase() ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์•ž์ชฝ์— ์œ„์น˜ํ•ด์•ผ ์ง€์šธ ์ˆ˜ ์žˆ์Œ.

์˜ˆ๋ฅผ ๋“ค์–ด 4 ๋ฒˆ์— ์žˆ์–ด์•ผ D ๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ์Œ. ์ดํ›„ ์˜ค๋ฅธ์ชฝ ๋ฌธ์ž ๋ฐ˜ํ™˜

3 ๋ฒˆ ์ž๋ฆฌ์—์„œ C ๋ฅผ ์ง€์› ์„ ๊ฒฝ์šฐ 4 ๋ฒˆ์ž๋ฆฌ์— ์œ„์น˜ํ•จ.

L.insert() ๋Š” ์‚ฝ์ž… ํ›„ ๋ฐ˜ํ™˜๊ฐ’์ด ์›๋ž˜ ๊ฐ€๋ฅดํ‚ค๋Š” ๋ฌธ์ž๋ฅผ ๊ฐ€๋ฅดํ‚ด

์˜ˆ๋ฅผ ๋“ค์–ด K ๋ฅผ 2 ๋ฒˆ์— ์‚ฝ์ž…ํ•œ ๊ฒฝ์šฐ 3 ๋ฒˆ ์ž๋ฆฌ์— ์œ„์น˜ํ•จ.

(1) A (2) K (3) B (4) C (5) D (6)

// ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ stl list ์‚ฌ์šฉ
#include <bits/stdc++.h>
 
using namespace std;
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    list<char> L;
    string str;
    int M;
    cin >> str;
    for(auto elem : str) {
        L.push_back(elem);
    }
    auto cursor = L.end();
    cin >> M;
    char p;
    while(M--) {
        cin >> p;
        switch(p) {
            case 'L':
                if(cursor != L.begin()) cursor--;
                break;
            case 'D':
                if(cursor != L.end()) cursor++;
                break;
            case 'B':
                if(cursor != L.begin()) {
                    cursor--;
                    cursor = L.erase(cursor);
                }
                break;
            case 'P':
                char inp;
                cin >> inp;
                L.insert(cursor, inp);
                break;
        }
        
    }
 
    for(auto elem : L)
        cout << elem;
 
    return 0;
}