ํฌ์ŠคํŠธ

๐ŸŒ“ BFS

๐Ÿ’ซ ์ •์˜


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

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

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

๐Ÿ’ซ ๊ตฌํ˜„


๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ์˜ BFS

BFS์—๋Š” ์ž๋ฃŒ๋ฅผ ๋‹ด์„ ํ๊ฐ€ ํ•„์š”ํ•˜๋‹ค
์•Œ๊ณ ๋ฆฌ๋“ฌ์ด ์‹œ์ž‘๋˜๋ฉด ์šฐ์„  (0, 0)์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ•ด๋‹น ์นธ์„ ํ์— ๋„ฃ์–ด์š”
์ด ์ดˆ๊ธฐ ์„ธํŒ…์ด ๋๋‚œ ํ›„์—๋Š” ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๊ณ„์ˆ™ ํ์˜ front๋ฅผ ๋นผ๊ณ  ํ•ด๋‹น ์ขŒํ‘œ์˜ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ์นธ์„ ํ์— ๋„ฃ์–ด์ฃผ๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณต
ํ๊ฐ€ ๋นˆ ์ˆœ๊ฐ„ ๊ณผ์ •์€ ์ข…๋ฃŒ

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

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

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);

	queue<pair<int,int>> Q;

	vis[0][0] = 1; // @ (0, 0)์„ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ๋ช…์‹œ
	Q.push({ 0, 0 }); // ํ์— ์‹œ์ž‘์ ์ธ (0, 0)์„ ์‚ฝ์ž….
	
	while(!Q.empty())
	{
		pair<int,int> cur = Q.front();
		Q.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; 
			Q.push({ nx, ny });
		}
	}
}


๐Ÿ’ซ ๋ฉ”๋ชจ


  • ๊ทธ๋ฆผํŒ์—์„œ ํŽ˜์ธํŠธ(ํ†ต) ๊ธฐ๋Šฅ
  • ์™ธ๋ถ€ ์œค๊ณฝ์„์„ ๋”ฐ๋ผ ๊ตฌ๋ถ„๋˜๋Š” ์˜์—ญ์˜ ์ƒ‰์„ ํ•œ ๋ฒˆ์— ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ

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


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