ํฌ์ŠคํŠธ

๐ŸŒ“ DFS

๐Ÿ’ซ ์ •์˜


BFS์—์„œ ํ ๋Œ€์‹  ์Šคํƒ์„ ์“ฐ๋Š”

DFS Depth-First-Search
๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฐ ์นธ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ ๊นŠ์ด๋ฅผ ์šฐ์„ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ๋“ฌ

๊นŠ์ด๋ฅผ ์šฐ์„ ์œผ๋กœ ๋ฐฉ๋ฌธ?
์„ค๋ช…ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค

์›๋ž˜ DFS๋Š” ๊ทธ๋ž˜ํ”„๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ๋“ฌ
๊ทธ๋ž˜ํ”„ : ์ •์ ๊ณผ ๊ฐ„์„ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ž๋ฃŒ๊ตฌ์กฐ

  1. ์‹œ์ž‘ํ•˜๋Š” ์นธ์„ ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊น€
  2. ์Šคํƒ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด์–ด ๊ทธ ์นธ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ์นธ์— ๋Œ€ํ•ด 3๋ฒˆ์„ ์ง„ํ–‰
  3. ํ•ด๋‹น ์นธ์„ ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ , ์ฒ˜์Œ์œผ๋กœ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ•ด๋‹น ์นธ์„ ์Šคํƒ์— ์‚ฝ์ž…
  4. ์Šคํƒ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ 2๋ฒˆ์„ ๋ฐ˜๋ชฉ ๋ฐฉ๋ฌธ ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์นธ์ด ์Šคํƒ์— 1๋ฒˆ์”ฉ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์นธ์ด N๊ฐœ์ผ ๋•Œ O(N).
    ํ–‰์ด R๊ฐœ์ด๊ณ  ์—ด์ด C๊ฐœ์ด๋ฉด O(RC)

BFS์™€ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋˜‘๊ฐ™๋”๋ผ๋„, ๋ฐฉ๋ฌธ ์ˆœ์„œ์— ์•„์ฃผ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค
BFS๋Š” ํŒŒ๋ฌธ ํผ์ง€๋“ฏ ์ƒํ•˜์ขŒ์šฐ๋กœ ํผ์ ธ๋‚˜๊ฐ€๋Š”, ๊ฑฐ๋ฆฌ ์ˆœ์„ ๋ฐฉ๋ฌธ
DFS๋Š” ๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ ๋•…๊ตด ํŒŒ๋“ฏ ๋ญ”๊ฐ€ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๋ง‰ํž ๋•Œ๊นŒ์ง€ ์ญ‰ ์ง์ง„

BFS์—์„œ ํ˜„์žฌ ๋ณด๋Š” ์นธ์œผ๋กœ๋ถ€ํ„ฐ ์ถ”๊ฐ€๋˜๋Š” ์ธ์ ‘ํ•œ ์นธ์€ ๊ฑฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ ๋ณด๋Š” ์นธ๋ณด๋‹ค 1๋งŒํผ ๋–จ์–ด์ ธ์žˆ๋”ฐ๋Š” ์„ฑ์งˆ์ด
DFS์—์„œ๋Š” ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์Œ
๊ทธ๋ž˜์„œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ๋Š” DFS๋ฅผ ์“ธ ์ˆ˜ ์—†์Œ

๊ทธ๋ž˜์„œ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ตณ์ด BFS ๋Œ€์‹  DFS๋ฅผ ์จ์•ผํ•˜๋Š” ์ผ์ด ์—†๋‹ค
Flood Fill์€ ์–ด๋Š๊ฒƒ์„ ์จ๋„ ๋˜๋Š”๋ฐ, ๊ฑฐ๋ฆฌ ์ธก์ •์€ BFS๋งŒ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ DFS๋ฅผ ์“ธ ์ผ์ด ์—†๋‹ค.
๊ทธ๋ž˜์„œ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ ์ˆœํšŒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ BFS๋งŒ ์“ฐ๊ฒŒ ๋œ๋‹ค

DFS๋Š” ๋‚˜์ค‘์— ๊ทธ๋ž˜ํ”„์™€ ํŠธ๋ฆฌ๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฐฐ์šธ ๋•Œ ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค

์–ด๋Š์ •๋„ ์ •์„์ ์ธ ๊ตฌํ˜„

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
#include <bits/stdc++.h>

using namespace std;

#define X first
#define Y second // pair์—์„œ first, second๋ฅผ ์ค„์—ฌ์„œ ์“ฐ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ

int board[502][502] = {
	{ 1, 1, 1, 0, 1, 0, 0, 0, 0, 0} ,
	{ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0} ,
	{ 1, 1, 1, 0, 1, 0, 0, 0, 0, 0} ,
	{ 1, 1, 0, 0, 1, 0, 0, 0, 0, 0} ,
	{ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0} ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; // 1์ด ํŒŒ๋ž€ ์นธ, 0์ด ๋นจ๊ฐ„ ์นธ์— ๋Œ€์‘
bool vis[502][502]; // visit ํ•ด๋‹น ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ €์žฅ
int n = 7, m = 10; // n = ํ–‰์˜ ์ˆ˜, m = ์—ด์˜ ์ˆ˜

int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 }; // ์ƒํ•˜์ขŒ์šฐ ๋„ค ๋ฐฉํ–ฅ์„ ์˜๋ฏธ

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	stack<pair<int,int> > S;

	vis[0][0] = 1; // @ (0, 0)์„ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ๋ช…์‹œ
	S.push({ 0, 0 }); // ํ์— ์‹œ์ž‘์ ์ธ (0, 0)์„ ์‚ฝ์ž….
	
	while(!S.empty())
	{
		pair<int,int> cur = S.top();
		S.pop();
		
		cout << '(' << cur.X << ", " << cur.Y << ") -> ";
		
		// ์ƒํ•˜์ขŒ์šฐ ์นธ์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.
		for (int dir = 0; dir < 4; dir++)
		{ 
			// nx, ny์— dir์—์„œ ์ •ํ•œ ๋ฐฉํ–ฅ์˜ ์ธ์ ‘ํ•œ ์นธ์˜ ์ขŒํ‘œ๊ฐ€ ๋“ค์–ด๊ฐ
			int nx = cur.X + dx[dir];
			int ny = cur.Y + dy[dir];

			// @ ์•„๋žซ์กฐ๊ฑด๋ณด๋‹ค ๋จผ์ €, ๋ฒ”์œ„ ๋ฐ–์ผ ๊ฒฝ์šฐ ๋„˜์–ด๊ฐ
			if (nx < 0 || nx >= n || ny < 0 || ny >= m)
				continue; 
			// ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์นธ์ด๊ฑฐ๋‚˜ ํŒŒ๋ž€ ์นธ์ด ์•„๋‹ ๊ฒฝ์šฐ
			if (vis[nx][ny] || board[nx][ny] != 1)
				continue;

			// (nx, ny)๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ๋ช…์‹œ
			// @ ๋„ฃ์„๋•Œ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ , ๋บ„ ๋•Œ ํ‘œ์‹œํ•œ๋‹ค๋ฉด ์ค‘๋ณต๋œ ์š”์†Œ๊ฐ€ ์Šคํƒ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ, ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋‹ค
			vis[nx][ny] = 1; 
			S.push({ nx, ny });
		}
	}
}
  • Flood Fill
  • ๊ฑฐ๋ฆฌ์ธก์ • (์ตœ๋‹จ๊ฑฐ๋ฆฌ)
    • ๋ฐฉ๋ฌธ ํ‘œ์‹œ ๋Œ€์‹  ์‹œ์ž‘์ ๊ณผ์˜ ๊ฑฐ๋ฆฌ
    • -1๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ ์—ฌ๋ถ€๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค
  • ์‹œ์ž‘์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ
    • ์—ฌ๋Ÿฌ ์‹œ์ž‘์ ์„ ํ์— ๋‹ค ๋„ฃ์œผ๋ฉด ๋จ
    • BFS ์„ฑ์งˆ -> ํ์—๋Š” ์š”์†Œ๊ฐ€ ๊ฑฐ๋ฆฌ(์‹œ๊ฐ„) ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด๊ฐ (ํ์— ์š”์†Œ๊ฐ€ ์Œ“์ด๋Š” ์ˆœ์„œ๋Š” ๊ฑฐ๋ฆฌ ์ˆœ)
  • ์‹œ์ž‘์ ์ด ๋‘ ์ข…๋ฅ˜
    • ๋ชจ๋‘ BFS๋ฅผ ๋Œ๋ฆผ
    • ํ•˜๋‚˜๋ฅผ ๋จผ์ € BFS. ์ˆœ์„œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด (์ „ํŒŒ๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด, ํ•œ์ชฝ๋งŒ ์˜ํ–ฅ์„ ์ค€๋‹ค๋ฉด)
    • ์ „ํŒŒ๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ์ค€๋‹ค๋ฉด -> ๋ฐฑ ํŠธ๋ž˜ํ‚น
  • 1์ฐจ์›์—์„œ์˜ BFS
    • ๋‹จ์ˆœํžˆ ์ „ํŒŒ๊ฐ€ ์ขŒ์šฐ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง€๋Š”


๐Ÿซง


์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.