1. ๋ฌธ์
A๋ฅผ B๋ก ๋ฐ๊พธ๊ธฐ ์ํ ์ต์ ์ฐ์ฐ์ ์ถ๋ ฅํ๋ ๋ฌธ์ ๋ค. 4์๋ฆฌ ์ซ์๋ฅผ ๋ชจ๋ ์กฐํํ๋๋ฐ 0000๋ถํฐ 9999๊น์ง ์ด 10000๊ฐ์ ์ ์ ์ด ํ์ํ๋ฏ๋ก BFS๋ฅผ ํ์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. (์ ์ ์ ๊ฐ์๊ฐ ๋ง์ง ์์)
D
: n * 2- num*2 > 9999๋ผ๋ฉด 10000์ผ๋ก ๋๋ ๊ฐ์ ๋๋จธ์ง ์ ์ฌ
S
: n - 1- n=0์ด๋ผ๋ฉด 9999 ์ ์ฌ
L
: ์ผ์ชฝ์ผ๋ก ์๋ฆฟ์ ์ด๋ (1234 $\rightarrow$ 2341)R
: ์ค๋ฅธ์ชฝ์ผ๋ก ์๋ฆฟ์ ์ด๋ (1234 $\rightarrow$ 4123)
2. ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฐฐ์ด์ ๋ง๋ค์ด ์ฐ์ฐ ์งํ ์ํฉ์ ๊ธฐ๋กํด์ผ ํ๋ค. ๋ฐฐ์ด์ ์ด ๋ค ๊ฐ๊ฐ ํ์ํ๋ค.
- ์ฐ์ฐ ํ์(๊ฑฐ๋ฆฌ):
dist[]
- ์ด์ ์ฐ์ฐ ๊ฒฐ๊ณผ:
pre[]
- ๋ช
๋ น์ด:
cmd[]
- ๋ฐฉ๋ฌธ์ฒ๋ฆฌ:
visited[]
10000๊ฐ์ ์ ์ ์ค A์์ B๋ก ์ฐ์ฐํ๊ธฐ ์ํ ๋ช
๋ น์ด ๊ฐ์๋ฅผ ์์ธกํ ์ ์๋ค. cmd[]
์ ๋ชจ๋ ์ฐ์ฐ ๊ณผ์ ์ ์ ์ฅํ ๊ฒฝ์ฐ ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ ํ์์ด ์ปค์ง ์ ์์ด ์ด์ ์ฐ์ฐ ๊ณผ์ ์ cmd[i]
์ ๋ชจ๋ ์ ์ฅํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์๋ค.
pre[]
์ ํตํด ์ด์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ญ์ถ์ ํ ์ ์์ผ๋ฏ๋ก cmd[]
์๋ i
๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฐ์ฅ ์ต๊ทผ ๋ช
๋ น์ด๋ง ์ ์ฅํ์.
i | dist[] | pre[] | cmd[] |
---|---|---|---|
0 | 2 | 1 | โSโ |
1 | 1 | 2 | โSโ |
2 | 0 | -1 | - |
3 | 2 | 4 | โSโ |
4 | 1 | 2 | โDโ |
5 | 3 | 0 | โSโ |
0~5๊น์ง์ ์ ๋ฒ์ ์ค 2์์ 3์ผ๋ก ์ด๋ํ๊ธฐ ์ํ ์ต์ ์ฐ์ฐ์ ์๊ฐํด๋ณด์. ์๋ ๋ฒํธ๋ ์ด๋ ๊ฑฐ๋ฆฌ dist
์ ๊ฐ์ด ๋๋ค.
- ์ด๋ ๊ฑฐ๋ฆฌ๊ฐ 0์ธ ์๋
2
๋ง ํด๋นํ๋ค. ์ด์ ๊ฐ์ ์์ผ๋ฏ๋ก -1, ๋ช ๋ น์ด๋ ๋น ์นธ์ผ๋ก ์ด๊ธฐํํ๋ค. -
2
์์ 2๋ฅผ ๊ณฑํ ์(D)4
์ 1์ ๊ฐ์ฐํ ์(S)1
์ด ํด๋นํ๋ค. 4
์์ 1์ ๊ฐ์ฐํ ์(S)3
๊ณผ1
์์ 1์ ๊ฐ์ฐํ ์0
์ด ๊ฐ๊ฐ ์ด๋๊ฑฐ๋ฆฌ 2๋ฅผ ๊ฐ๋๋ค.
๋ฐ๋ผ์ 2์์ 3์ ๊ณ์ฐํ๊ธฐ ์ํ ์ฐ์ฐ ๊ณผ์ ์ ์ด 2๋ฒ์ด ๋๋ค. pre
๋ฐฐ์ด์ ํตํด ๋ช
๋ น์ด๋ฅผ ์ญ์ถ์ ํ ๋ฌธ์์ด์ SD
๊ฐ ๋๋ฉฐ ์ต์ข
๊ฒฐ๊ณผ๋ก DS
๋ฅผ ์ถ๋ ฅํ๋ค.
3. ์์ค ์ฝ๋
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
94
95
96
97
98
99
100
101
102
#include <stdio.h>
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
int t, a, b, num, cal;
int dist[10001];
int pre[10001];
char cmd[10001];
bool visited[10001];
queue<int> q;
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d %d", &a, &b);
// ๊ฐ text๋ง๋ค ๋ฐฐ์ด ์ด๊ธฐํ
memset(dist, 0, sizeof(dist));
memset(pre, 0, sizeof(pre));
memset(cmd, 0, sizeof(cmd));
memset(visited, 0, sizeof(visited));
dist[a] = 0;
pre[a] = -1;
visited[a] = true;
q.push(a);
while (!q.empty())
{
num = q.front();
q.pop();
// num*2
cal = num * 2;
if (cal > 9999) cal = cal % 10000;
if (visited[cal] == 0)
{
q.push(cal);
dist[cal] = dist[num] + 1;
pre[cal] = num;
cmd[cal] = 'D';
visited[cal] = 1;
}
// num-1
cal = num - 1;
if (cal == -1) cal = 9999;
if (visited[cal] == 0)
{
q.push(cal);
dist[cal] = dist[num] + 1;
pre[cal] = num;
cmd[cal] = 'S';
visited[cal] = 1;
}
// ์ผ์ชฝ์ผ๋ก num ์๋ฆฟ์ ์ด๋
cal = (num % 1000) * 10 + num / 1000;
if (visited[cal] == 0)
{
q.push(cal);
dist[cal] = dist[num] + 1;
pre[cal] = num;
cmd[cal] = 'L';
visited[cal] = 1;
}
// ์ค๋ฅธ์ชฝ์ผ๋ก num ์๋ฆฟ์ ์ด๋
cal = (num / 10) + (num % 10) * 1000;
if (visited[cal] == 0)
{
q.push(cal);
dist[cal] = dist[num] + 1;
pre[cal] = num;
cmd[cal] = 'R';
visited[cal] = 1;
}
}
// ๋ฌธ์์ด ์ด๊ธฐํ ๋ฐ ๊ฒฐ๊ณผ๊ฐ ํ ๋น
string result;
while (b != a)
{
result.push_back(cmd[b]);
b = pre[b];
}
// ๋ฌธ์์ด ์ญ์ถ๋ ฅ
while (!result.empty())
{
printf("%c", result.back());
result.pop_back();
}
printf("\n");
}
}
4. ์๊ฐ ์ ๋ฆฌ
์ผ์ด์ค๋ง๋ค bfs๋ฅผ ๋๋์ด ํด๊ฒฐํ๋ ๋ฌธ์ ๋ค. ์กฐ๊ฑด์ ๋ง๋ bfs ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๋ฌ ๋ฒ ์์ฑํด๋ ์ํ๋ ๊ฐ์ ๋๋ฌํ ์ ์๋ค. ๋ฌด์์ ์๊ณ ๋ฆฌ์ฆ ์ฝ๋๋ฅผ ์ธ์ฐ๋ ค๊ณ ํ์ง ๋ง๊ณ ์ด๋ก ์ ์๋ฒฝํ ์ดํดํ๋ ๊ฒ ์ค์ํ๋ค.
์ฝ๋ ์์ฑ ๋์ค ๋ฐ๋ณด ๊ฐ์ ์ค์๋ฅผ ํ๋ค. ์ผ์ด์ค๋ง๋ค ์ฐ์ฐ ๋ฐฐ์ด๊ณผ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ด๊ธฐํํด์ผ ํ
์คํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด๋ ํ๋ก๊ทธ๋จ์ด ๋์ํ ์ ์๋คโฆ ๋ ์ฌ์ค์ ์์ด๋ฒ๋ฆฌ๊ณ ์ ์ญ์ผ๋ก ๋ฐฐ์ด๊ณผ ๋ฌธ์์ด์ ์ด๊ธฐํํ ๊ฒ์ด๋ค. ์ผ์ด์ค๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ ๋ ๋ค์ ์ฐ์ด๋ ๋ณ์๊ฐ ์๋์ง, ๋ฐ์ดํฐ ๋ฎ์ด์ฐ๊ธฐ๊ฐ ํ์ฉ๋๋์ง(a
, b
์ฒ๋ผ!) ๊ณ ๋ คํ๋ฉด์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ์ข๊ฒ ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ผญ ํ๋ก๊ทธ๋จ ๋์ ๊ณผ์ ์ ์๊ฐํ๋ฉด์ ์ฝ๋๋ฅผ ์ธ ๊ฒ!! ๊ฐ์ ์ค์๋ฅผ ๋ฐ๋ณตํ์ง ์๋๋ก ๋
ธ๋ ฅํ์.
Leave a comment