๐ DFS
๐ซ ์ ์
BFS์์ ํ ๋์ ์คํ์ ์ฐ๋
DFS Depth-First-Search
๋ค์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ ์นธ์ ๋ฐฉ๋ฌธํ ๋ ๊น์ด๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ ์๊ณ ๋ฆฌ๋ฌ
๊น์ด๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธ?
์ค๋ช
ํ ๋ฐฉ๋ฒ์ด ์๋ค
์๋ DFS๋ ๊ทธ๋ํ๋ผ๋ ์๋ฃ๊ตฌ์กฐ์์ ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ๋ฌ
๊ทธ๋ํ : ์ ์ ๊ณผ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ๊ตฌ์กฐ
- ์์ํ๋ ์นธ์ ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ฅผ ๋จ๊น
์คํ
์์ ์์๋ฅผ ๊บผ๋ด์ด ๊ทธ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ ๋ํด 3๋ฒ์ ์งํ- ํด๋น ์นธ์ ์ด์ ์ ๋ฐฉ๋ฌธํ๋ค๋ฉด ์๋ฌด ๊ฒ๋ ํ์ง ์๊ณ , ์ฒ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ค๋ฉด ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ฅผ ๋จ๊ธฐ๊ณ ํด๋น ์นธ์
์คํ
์ ์ฝ์ ์คํ
๊ฐ ๋น ๋๊น์ง 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
- ๋จ์ํ ์ ํ๊ฐ ์ข์ฐ๋ก๋ง ์ด๋ฃจ์ด์ง๋