Baekjoon 1406 - ์๋ํฐ
Baekjoon 1406 - ์๋ํฐ
๐ซ ๋ฌธ์
๐ซง Example Input/Output
1
2
3
4
5
6
7
8
9
10
11
12
13
// IN
abcd // ์ด๊ธฐ ๋ฌธ์์ด (์์ด ์๋ฌธ์, ์ต๋ 100,000 ๊ธ์)
3 // m : ๋ช
๋ น์ด ์ (1 <= m <= 500,000)
B // ์ปค์ ์ผ์ชฝ ์ญ์ (์ปค์๋ ์ฒ์์ ๋ฌธ์์ด ๋งจ ์ค๋ฅธ์ชฝ์ ์์นํด ์์)
P d // d ๋ฅผ ์ปค์ ์ผ์ชฝ์ ์ถ๊ฐ
P x // x ๋ฅผ ์ปค์ ์ผ์ชฝ์ ์ถ๊ฐ
L // ์ปค์ ์ผ์ชฝ์ผ๋ก ์ด๋
D // ์ปค์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
L
P y
// OUT
abcdyx
๐ซ C++ ํ์ด
๐ซง 1. ์ผ๋งค ์ฐ๊ฒฐ๋ฆฌ์คํธ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <algorithm>
using namespace std;
// ๋ฐํน๋
์ผ์ธ์ ์ผ๋งค ์ฐ๊ฒฐ๋ฆฌ์คํธ
const int MAX = 1000005;
char dat[MAX];
int nxt[MAX], pre[MAX];
int unused = 1;
void insert(int addr, char newData)
{
dat[unused] = newData;
nxt[unused] = nxt[addr];
pre[unused] = addr;
nxt[addr] = unused;
if (nxt[unused] != -1)
pre[nxt[unused]] = 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];
}
cout << '\n';
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
fill(pre, pre + MAX, -1);
fill(nxt, nxt + MAX, -1);
string s;
cin >> s;
int cursor = 0;
for (auto c : s)
{
insert(cursor, c);
cursor = nxt[cursor];
}
int m;
cin >> m;
for (int i = 0; i < m; i++)
{
char command;
cin >> command;
if (command == 'L')
{
if (pre[cursor] != -1)
cursor = pre[cursor];
}
else if (command == 'D')
{
if (nxt[cursor] != -1)
cursor = nxt[cursor];
}
else if (command == 'B')
{
if (pre[cursor] == -1)
continue;
erase(cursor);
cursor = pre[cursor];
}
else if (command == 'P')
{
cin >> command;
insert(cursor, command);
cursor = nxt[cursor];
}
}
traverse();
}
๐ซง 2. STL list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
list<char> l;
string s;
cin >> s;
for (auto c : s)
l.push_back(c);
list<char>::iterator cursor = l.end();
int m;
cin >> m;
for (int i = 0; i < m; i++)
{
char command;
cin >> command;
if (command == 'L')
{
if (cursor == l.begin())
continue;
cursor--;
}
else if (command == 'D')
{
if (cursor != l.end())
cursor++;
}
else if (command == 'B')
{
if (cursor == l.begin())
continue;
cursor = l.erase(--cursor);
}
else if (command == 'P')
{
cin >> command;
l.insert(cursor, command);
}
}
for (auto c : l)
cout << c;
}
๐ซ Memo
- ๋ฐํน๋
์ผ์ธ์ ๊ฐ์ ์์์ ํ ๋ฒ ๋ณธ ์ดํ ํ๊ธฐ ์์
์ผ๋งค ์ฐ๊ฒฐ๋ฆฌ์คํธ
๋ Dummy Node๊ฐ ๊ฐ์ฅ ์์ ์๊ณ ,STL list
๋ Dummy Node๊ฐ ๊ฐ์ฅ ๋ค์ ์๋ค๋ ๋๊ธ์ ๋ดค์๋๋ฐ, ๊ทธ๊ฒ ํํธ๊ฐ ๋๋ค.- ์ ๊ทธ๋ฆผ์ ๊ฐ ํ์ด ๋ฐฉ๋ฒ ๋ณ ์ปค์ ์์น (์๊ฐํ๊ธฐ ์ฝ๊ฒ ์ปค์๊ฐ ๋ฐ์ดํฐ ์์ ์์นํ๋๊ฑธ๋ก)
์ผ๋งค ์ฐ๊ฒฐ๋ฆฌ์คํธ
๋ก ํ ๋ ๋ฒ๊ทธ๋ก ์ก๋ ๊ฒ ๋๋ฌด ํ๋ค์๋ค.STL list
๋ก ๋จผ์ ํผ ๋ค์,์ผ๋งค ์ฐ๊ฒฐ๋ฆฌ์คํธ
๋ฅผ ๋ค์ ํ๊ธฐ ์์ํ๋ ์กฐ๊ธ ์์ํ๋ค.๋ค ํ๊ณ ๋ฐํน๋ ์ผ์ธ์ ๋ต์๊ณผ ์ฒดํฌํด๋ณด๋ ๋๊ฐ์ด ํ์ด์ ์์ฌํ๋ค.
- @ TIME : ์คํ์ ์ด์ฉํ ํ์ด
์ด ๊ธฐ์ฌ๋ ์ ์๊ถ์์ CC BY 4.0 ๋ผ์ด์ผ์ค๋ฅผ ๋ฐ๋ฆ
๋๋ค.