Home Week4 - BFS
Post
Cancel

Week4 - BFS

๐Ÿ“ ๋ฌธ์ œ ๋ชฉ๋ก


๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•œ ๊ฒƒ์œผ๋กœ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
ํ˜น ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ง€์ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ™


1. ์ˆจ๋ฐ”๊ผญ์งˆ

๊ทธ๋ฆฌ๋””๋ฅผ ๋– ์˜ฌ๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๋ฆฌ๋””๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹˜์„ ๊ธˆ๋ฐฉ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 5์—์„œ 12๋กœ ๊ฐ„๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” 5->6->12 ์ด์ง€๋งŒ
๊ทธ๋ฆฌ๋””๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 5->10->11->12์˜ ๊ฒฝ๋กœ๋กœ ๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
์ด ๋ฌธ์ œ์ฒ˜๋Ÿผ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ๋•Œ ์ฃผ๋กœ BFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ํ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ˜๋ณต๋ฌธ ํ•œ ํ„ด์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋“ค์„ ํ์— ๋„ฃ๊ณ  ๊ฐ ์œ„์น˜์˜ ์นด์šดํŠธ๋ฅผ ํ˜„์žฌ ์นด์šดํŠธ+1๋กœ ์ €์žฅํ•ด๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.
์ผ๋‹จ ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๋Š”๋ฐ ๋„์ค‘์— ์ •๋‹ต์ด ๋‚˜์˜ค๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค.
์ด๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ์žˆ๋‹ค. ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๋‚˜ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋œฐ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ: ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋˜ ์œ„์น˜๊ฐ€ ๊ณ„์†ํ•ด์„œ ํ์— push๋˜๋ฏ€๋กœ ํ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒ.
  • ๋ฐฉ๋ฌธ ๋ฒ”์œ„ ์ œํ•œ: ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋ฐœ์ƒ.

๋”ฐ๋ผ์„œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด boolํ˜• ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ฃผ๊ณ  ๋ฐฐ์—ด์˜ ํฌ๊ธฐ ๋ฐ ๋ฐฉ๋ฌธ ์ œํ•œ ์ง€์ ์€ ๋ฌธ์ œ์—์„œ ์œ„์น˜์˜ ์ตœ๋Œ€๊ฐ’์ธ 100000์„ ๋„˜์ง€ ์•Š๋„๋ก ํ–ˆ๋‹ค.
(์–ด๋–ค ์œ„์น˜ n๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ์— n์„ ์ดˆ๊ณผํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๋Š” ํ™€์ˆ˜์ผ๋•Œ๋‚˜ ์กด์žฌํ•˜๊ณ (ex: 5->10->9) ํ™€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด n/2 ์ง€์ ์—์„œ 2๋ฐฐ๋ฅผ ํ•œ ๊ฒƒ๋ณด๋‹ค n์„ ์ดˆ๊ณผํ•œ ์œ„์น˜์—์„œ -1๋กœ ์ด๋™ํ•˜๋Š” ๊ฒŒ ๋” ๋น ๋ฅผ ์ˆ˜๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค)

์‹œ๊ฐ„๋ณต์žก๋„๋กœ ๋”ฐ์ ธ๋ณธ๋‹ค๋ฉด ๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š๊ณ  ์‹คํ–‰ํ–ˆ์„ ๋•Œ๋Š” ๋ฐ˜๋ณต๋ฌธ ํ•œ ํ„ด๋‹น ๊ฒฝ๋กœ๊ฐ€ 3๊ฐ€์ง€์ด๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(3^n)์ด ๋  ๊ฒƒ์ด๋‹ค.
ํ•˜์ง€๋งŒ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ์—๋Š” ๊ฐ™์€ ์ •์ ์„ ๋‘ ๋ฒˆ ์ด์ƒ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํฌ๊ฒŒ ์ค„์–ด๋“ ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ธ์ ‘ํ–‰๋ ฌ๋กœ ์ €์žฅํ–ˆ์œผ๋ฏ€๋กœ V๊ฐœ์˜ ์ •์ ๊ณผ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•ด ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ์‹œ๊ฐ„๊นŒ์ง€ ์ด O(V^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.
์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ์‹œ๊ฐ„+๋ชจ๋“  ๊ฐ„์„ ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ์‹œ๊ฐ„๋งŒํผ๋งŒ ๊ฑธ๋ฆฐ๋‹ค. ์ฆ‰ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(V+E)์ด ๋œ๋‹ค. (V: ์ •์ ๊ฐœ์ˆ˜, E: ๊ฐ„์„ ๊ฐœ์ˆ˜) BFS์˜ ๋ฐฉ๋ฌธ ํ๋ฆ„์„ ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ ค๋ณด๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
(์ฐธ๊ณ : https://www.acmicpc.net/board/view/47137)

ํ์— ๋“ค์–ด๊ฐˆ ์ž๋ฃŒํ˜•์€ pair<int, int>๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋ฌธ์ œ ํ’€ ๋‹น์‹œ์—๋Š” ์ƒ๊ฐ์ด ์•ˆ ๋‚˜์„œ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์Šคํ„ฐ๋””์—์„œ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ๋“ฃ๊ณ  ๊ณ ์ณค๋‹ค.
์‹ค์€ ์—ฌ๋Ÿฌ๋ฒˆ ํ’€์–ด๋ดค๋˜ ์œ ํ˜•์ธ๋ฐ๋„ ์ด๋ฒˆ์— ํ’€์—ˆ์„ ๋•Œ ๊ธฐ๋ณธ์ ์ธ ๋ถ€๋ถ„๋“ค์—์„œ ์‹ค์ˆ˜๋ฅผ ๋ฒ”ํ–ˆ๋‹ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์–ต์€ ์ž˜ ์•ˆ ๋‚˜์ง€๋งŒ ๋ถ„๋ช… ์ด๊ฒŒ ์ฒ˜์Œ ํ•œ ์‹ค์ˆ˜๋Š” ์•„๋‹ˆ์—ˆ์„ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์— ์ข€ ๋ฐ˜์„ฑํ–ˆ๋‹ค.
๋„ˆ๋ฌด ๊ธ‰ํ•˜๊ฒŒ ํ’€๋ ค๊ณ  ํ•ด์„œ ๊ทธ๋žฌ์„๊นŒ? ์Šคํ”ผ๋””ํ•˜๊ฒŒ ํ‘ธ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ๊ทธ๋ณด๋‹ค ์šฐ์„  ์ž‘์„ฑํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋นˆํ‹ˆ์ด ์—†๋Š”์ง€ ์ข€๋” ๊ผผ๊ผผํ•˜๊ฒŒ ์ฒดํฌํ•˜๋ฉฐ ํ’€๋„๋ก ํ•˜์ž. ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๊ฐ€๋ฉด์„œโ€ฆ

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ pushํ• ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ popํ•˜๋Š” ์‹œ์ ์—์„œ ํ•ด์คฌ๋Š”๋ฐ ์˜ค๋‹ต์€ ์•„๋‹ˆ์ง€๋งŒ ์—ญ์‹œ pushํ• ๋•Œ(=๋ฒ”์œ„์ฒดํฌํ• ๋•Œ) ๊ฐ™์ด ์ฒดํฌํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ฝ”๋“œ

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
#include<iostream>
#include<vector>
#include<queue>

using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int n, k, cur_pos;
	int cur_cnt = 0;
	vector<bool> check;
	queue<pair<int, int>> q;
	cin >> n >> k;

	check.assign(100001, false);
	q.push({ n, cur_cnt });

	while (!q.empty()) {
		cur_pos = q.front().first;
		cur_cnt = q.front().second;
		q.pop();

		if (cur_pos == k) break;

		if (!check[cur_pos]) {
			check[cur_pos] = true;

			if (cur_pos - 1 >= 0) q.push({ cur_pos - 1, cur_cnt + 1 });
			if (cur_pos + 1 <= 100000) q.push({ cur_pos + 1, cur_cnt + 1 });
			if (cur_pos * 2 <= 100000) q.push({ cur_pos * 2, cur_cnt + 1 });
		}
	}

	cout << cur_cnt;
}


2. ์Šคํƒ€ํŠธ๋งํฌ

์œ„ ๋ฌธ์ œ์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ์ด๋‚˜ ์ด ๋ฌธ์ œ๋Š” ์ฃผ์–ด์ง„ ์ด๋™๊ฑฐ๋ฆฌ์— ๋”ฐ๋ผ์„œ ์ •๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค. ๊ทธ๋Ÿด ๊ฒฝ์šฐ โ€œuse the stairsโ€๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์นด์šดํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐ๊ฐ’(0)์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋˜๋ฏ€๋กœ ๋”ฐ๋กœ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™์•„ ์นด์šดํŠธ ๊ฐ’์œผ๋กœ ์ฒดํฌํ•˜๋„๋ก ํ–ˆ๋‹ค. (๋‹จ ์‹œ์ž‘์ ์€ 0์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ์‹œ์ž‘์ ์€ ์ œ์™ธ)
๋”ฐ๋ผ์„œ ํ์— push๋˜๋Š” ์กฐ๊ฑด์œผ๋กœ๋Š”, ํ˜„์žฌ์œ„์น˜+U(์œ„๋กœ ์ด๋™)์™€ ํ˜„์žฌ์œ„์น˜-D(์•„๋ž˜๋กœ ์ด๋™)์— ๋Œ€ํ•˜์—ฌ

1
2
3
โ‘  ์ด๋™ ํ›„์˜ ์œ„์น˜๊ฐ€ S(์‹œ์ž‘์ )๊ฐ€ ์•„๋‹ˆ๊ณ 
โ‘ก ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ 
โ‘ข ์ธต์ˆ˜์ œํ•œ์„ ๋„˜์ง€ ์•Š์„ ๋•Œ(1~F์ผ ๋•Œ)

๊ฐ๊ฐ pushํ•˜๋„๋ก ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ •๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ์ด ์ข…๋ฃŒ๋œ ํ›„ ํ˜„์žฌ ์œ„์น˜๊ฐ€ G(๋ชฉํ‘œ์ง€์ )๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด โ€œuse the stairsโ€๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ํ–ˆ๋‹ค.

์ฝ”๋“œ

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
#include<iostream>
#include<vector>
#include<queue>

using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int f, s, g, u, d, cur;
	vector<int> cnt;
	queue<int> q;
	cin >> f >> s >> g >> u >> d;

	cnt.assign(f + 1, 0);
	cur = s;
	q.push(s);

	while (!q.empty()) {
		cur = q.front();
		q.pop();

		if (cur == g) break;

		int up = cur + u;
		int down = cur - d;
		if (up != s && up <= f && cnt[up] == 0) {
			cnt[up] = cnt[cur] + 1;
			q.push(up);
		}
		if (down != s && down > 0 && cnt[down] == 0) {
			cnt[down] = cnt[cur] + 1;
			q.push(down);
		}
	}

	if (cur == g) cout << cnt[g];
	else cout << "use the stairs";
}


3. ์ด๋ชจํ‹ฐ์ฝ˜

์ด ๋ฌธ์ œ๋„ ์œ„์น˜๋ผ๋Š” ํ‘œํ˜„์ด ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐœ์ˆ˜๋กœ ๋ฐ”๋€Œ์—ˆ์„ ๋ฟ ์œ„ ๋‘ ๋ฌธ์ œ์™€ ๋น„์Šทํ•œ ์œ ํ˜•์ด์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ ๋ณ€ํ™”๋Ÿ‰์ด ๊ฐ€๋ณ€์ ์ด๋‹ค. ํ˜„์žฌ ํด๋ฆฝ๋ณด๋“œ์— ๋ช‡ ๊ฐœ์˜ ์ด๋ชจํ‹ฐ์ฝ˜์ด ์ €์žฅ๋˜์–ด ์žˆ๋ƒ์— ๋”ฐ๋ผ ๋Š˜์–ด๋‚˜๋Š” ๊ฐœ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.
๋˜ํ•œ ํด๋ฆฝ๋ณด๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ํ–‰์œ„๋„ ์นด์šดํŠธ์— ํฌํ•จ๋œ๋‹ค.

์‚ฌ์‹ค ๋‚˜๋Š” ๊ฐ€์žฅ ๋จผ์ € DP๋ฐฉ์‹์„ ๋– ์˜ฌ๋ ธ๋‹ค. ํด๋ฆฝ๋ณด๋“œ์—์„œ ๋ช‡๊ฐœ์งœ๋ฆฌ๋ฅผ ๋ถ™์—ฌ๋„ฃ์—ˆ๋Š๋ƒ์— ๋”ฐ๋ผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋”๋ผ๋„ ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ–ˆ๋‹ค.

1
2
3
๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ํ˜„์žฌ ์ž…๋ ฅ๋œ ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐœ์ˆ˜ ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐœ์ˆ˜์˜ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์นด์šดํŠธ๋ฅผ ๊ตฌํ•œ๋‹ค.
(ํ˜„์žฌ ์ž…๋ ฅ๋œ ์ด๋ชจํ‹ฐ์ฝ˜์˜ ์นด์šดํŠธ๊ฐ’ + ๋ณต์‚ฌ1๋ฒˆ + ๋ถ™์—ฌ๋„ฃ๊ธฐ n๋ฒˆ)
์ด๋•Œ ์–ด๋–ค ๊ฐœ์ˆ˜์— ๋Œ€ํ•ด ์นด์šดํŠธ๋ฅผ ์ฒ˜์Œ ๊ตฌํ–ˆ๊ฑฐ๋‚˜ ์ด์ „์— ๊ตฌํ•œ ์นด์šดํŠธ ๊ฐ’๋ณด๋‹ค ์ž‘์„ ๋•Œ๋งŒ ์นด์šดํŠธ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

์ด ์ดํ›„ ์ด๋ชจํ‹ฐ์ฝ˜์„ ํ•˜๋‚˜ ์‚ญ์ œํ–ˆ์„ ๋•Œ์˜ ์นด์šดํŠธ๊ฐ’๋„ ๊ตฌํ•ด์„œ ์œ„ ๋™์ผ ์กฐ๊ฑด์œผ๋กœ ๋น„๊ตํ•ด ๊ฐฑ์‹ ํ–ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑด ๋งํ–ˆ๋“ฏ์ด DP๋ผ์„œ BFS๋กœ ํ’€๋ ค๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์•„๋ฌด๋ฆฌ ์ƒ๊ฐํ•ด๋„ ์ € ๋ฐฉ๋ฒ• ๋ง๊ณ ๋Š” ๋– ์˜ค๋ฅด์ง€ ์•Š์•„์„œ ์ €๊ธฐ๋‹ค BFS๋ฅผ ๋งŒ๋“ ๋‹ต์‹œ๊ณ  ๋ญ”๊ฐ€ ๊ดด์ƒํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ๋ง์•˜๋‹คโ€ฆ ํ†ต๊ณผ๋Š” ํ–ˆ์ง€๋งŒ ํ์— ๋„ฃ๋Š”๋‹ค๊ณ  BFS๊ฐ€ ๋˜๋Š”๊ฒŒ ์•„๋‹Œ๊ฒƒ์„โ€ฆ ์•”ํŠผ ๊ทธ๋ž˜์„œ ์Šคํ„ฐ๋”” ์ดํ›„ ์ œ๋Œ€๋กœ ๋œ BFS ๋ฐฉ์‹์œผ๋กœ ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ์งœ ๋ณด์•˜๋‹ค. ์ด๋ฏธ ์Šคํ„ฐ๋””์™€ ์ธํ„ฐ๋„ท์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ’€์ด๋ฅผ ๋ด๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜๋Š” ์ง์ ‘ ์ƒ๊ฐํ•ด๋‚ธ ๋‚ด์šฉ์€ ์•„๋‹ˆ๊ณ  ๊ทธ๋ƒฅ ๋ณต์Šต ๊ฒธ ํ๋ฆ„์„ ์ •๋ฆฌํ•ด๋ดค๋‹ค.

์ผ๋‹จ ์œ„์—์„œ ๋งํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ n๊ฐœ์˜ ์ด๋ชจํ‹ฐ์ฝ˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ํด๋ฆฝ๋ณด๋“œ ๊ฒฝ๋กœ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , ๊ฐ๊ฐ์˜ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ โ€˜n๊ฐœ์˜ ์ด๋ชจํ‹ฐ์ฝ˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์„ ํƒํ•œ ์–ด๋–ค ๊ฒฝ๋กœโ€™์— ๋Œ€ํ•œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๊ฒฝ๋กœ๋ณ„๋กœ ์•Œ์•„์•ผ ํ•œ๋‹ค.

ํ•œ ๋ฒˆ์˜ ์—ฐ์‚ฐ์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋Š” 3๊ฐ€์ง€์ด๋‹ค.

1
2
3
โ‘  ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ ํด๋ฆฝ๋ณด๋“œ๋กœ ๋ณต์‚ฌ
โ‘ก ํด๋ฆฝ๋ณด๋“œ์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ ํ™”๋ฉด์— ๋ถ™์—ฌ๋„ฃ๊ธฐ
โ‘ข ํ™”๋ฉด์— ์žˆ๋Š” ์ด๋ชจํ‹ฐ์ฝ˜์„ ํ•˜๋‚˜ ์‚ญ์ œ

์ด๋ฅผ ํ™”๋ฉด์—์„œ์˜ ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐœ์ˆ˜(sn)์™€ ํด๋ฆฝ๋ณด๋“œ์—์„œ์˜ ์ด๋ชจํ‹ฐ์ฝ˜ ๊ฐœ์ˆ˜(cn) ๋ณ€ํ™”๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1
2
3
โ‘  sn,cn -> sn,sn
โ‘ก sn,cn -> sn+cn,cn
โ‘ข sn,cn -> sn-1,cn

์ฆ‰ ์ด์ „ ๋ฌธ์ œ๋“ค์—์„œ๋Š” ์œ„์น˜๋งŒ ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ๋Š” ํ™”๋ฉด๊ณผ ํด๋ฆฝ๋ณด๋“œ ๋‘ ๊ฐ€์ง€๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์„œ ์นด์šดํŠธํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ฆฐ๋‹ค๋ฉด ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ์— ๋“ค์–ด๊ฐˆ ์ž๋ฃŒํ˜•์€ ๊ฐœ์ธ์ ์œผ๋กœ sn,cn์„ ๋ฌถ๊ณ  cnt๋ฅผ ๋”ฐ๋กœ ๋‘” ํ˜•ํƒœ๊ฐ€ ๋งˆ์Œ์— ๋“ค์–ด์„œ ์ด์ค‘ pair๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ฝ”๋“œ

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
#include<iostream>
#include<queue>

using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int s;
	int cnt = 0;
	bool check[1001][1001] = { false };
	queue<pair<pair<int, int>, int>> q;
	cin >> s;

	check[1][0] = true;
	q.push({ { 1,0 }, 0 });

	while (!q.empty()) {
		int sn = q.front().first.first;
		int cn = q.front().first.second;
		cnt = q.front().second;

		if (sn == s) break;

		q.pop();

		if (sn > 0 && sn < 1001) {
			// ํ™”๋ฉด์˜ ๋‚ด์šฉ์„ ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌ (sn,cn -> sn,sn)
			if (!check[sn][sn]) {
				check[sn][sn] = true;
				q.push({ { sn, sn }, cnt + 1 });
			}

			// ํด๋ฆฝ๋ณด๋“œ์˜ ๋‚ด์šฉ์„ ํ™”๋ฉด์— ๋ถ™์—ฌ๋„ฃ๊ธฐ (sn,cn -> sn+cn,cn)
			if (sn + cn < 1001 && cn > 0 && !check[sn + cn][cn]) {
				check[sn + cn][cn] = true;
				q.push({ { sn + cn, cn }, cnt + 1 });
			}

			// ํ™”๋ฉด์˜ ์ด๋ชจํ‹ฐ์ฝ˜์„ 1๊ฐœ ์‚ญ์ œ (sn,cn -> sn-1,cn)
			if (!check[sn - 1][cn]) {
				check[sn - 1][cn] = true;
				q.push({ { sn - 1, cn }, cnt + 1 });
			}
		}
	}

	cout << cnt;
}
This post is licensed under CC BY 4.0 by the author.

Week3 - Binary Search, Two Pointer

Week5 - DFS

Comments powered by Disqus.