Ch5 BFS,DFS 5-2
๐ DFS (Depth-First Search), BFS(Bredth-First Search) ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ํ์ ๊ธฐ๋ณธ๊ตฌ์กฐ
- ๊ทธ๋ํ๋ ๋ ธ๋(Node)์ ๊ฐ์ (Edge)์ผ๋ก ํํ๋์ด ์ด๋ ๋ ธ๋๋ฅผ ์ ์ (Vertex)์ด๋ผ๊ณ ๋ ๋งํ๋ค.
- ํ๋ก๊ทธ๋๋ฐ์์ ๊ทธ๋ํ๋ ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ํํ ๊ฐ๋ฅ
- ์ธ์ ํ๋ ฌ(Adjacency Matrix): 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
- ์ธ์ ๋ฆฌ์คํธ(Adjacency List): ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
์ธ์ ํ๋ ฌ(Adjacency Matrix)
INF = 999999999 # ๋ฌดํ์ ๋น์ฉ ์ ์ธ
# 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ์ธ์ ํ๋ ฌ ํํ
graph =[
[0,7,5],
[7,0,INF],
[5,INF,0]
]
print(graph)
# --> [[0, 7, 5], [7, 0, 999999999], [5, 999999999, 0]]
์ธ์ ๋ฆฌ์คํธ(Adjacency List)
# ํ(Row)์ด 3๊ฐ์ธ 2์ฐจ์ ๋ฆฌ์คํธ๋ก ์ธ์ ๋ฆฌ์คํธ ํํ
graph = [[] for _ in range(3)]
# ๋
ธ๋ 0์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ(๋
ธ๋, ๊ฑฐ๋ฆฌ)
graph[0].append((1, 7))
graph[0].append((2, 5))
# ๋
ธ๋ 1์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ(๋
ธ๋, ๊ฑฐ๋ฆฌ)
graph[1].append((0, 7))
# ๋
ธ๋ 2์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ(๋
ธ๋, ๊ฑฐ๋ฆฌ)
graph[2].append((0, 5))
print(graph)
# --> [[(1, 7), (2, 5)], [(0, 7)], [(0, 5)]]
๐๋ ๋ฐฉ์์ ์ฐจ์ด
- ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋ชจ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ ธ๋ ๊ฐ์๊ฐ ๋ง์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถํ์ํ๊ฒ ๋ญ๋น๋๋ค.
- ๋ฐ๋ฉด์ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ง์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
- ํ์ง๋ง ์ด์ ๊ฐ์ ์์ฑ ๋๋ฌธ์ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋นํด ์ ๋ณด๋ฅผ ์ป๋ ์๋๊ฐ ๋๋ฆฌ๋ค.
DFS(Depth-First Search)
- DFS๋ ๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ(ํน์ ์ฌ๊ท ํจ์)๋ฅผ ์ด์ฉํ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ํ ๋ ธ๋๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ๊ทธ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- 2๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
๐DFS ํน์ง
- ๊น์ด ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ธ DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค.
- ์ค์ ๋ก๋ ์คํ์ ์ฐ์ง ์์๋ ๋๋ฉฐ ํ์์ ์ํํจ์ ์์ด O(N)์ ์๊ฐ์ด ์์๋๋๋ค.
- DFS๋ ์คํ์ ์ด์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๊ตฌํ์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ์ ๋ ๋งค์ฐ ๊ฐ๊ฒฐํ๊ฒ ๊ฐ๋ฅํ๋ค.
- ์ด๋ํ ๋๋ง๋ค ๊ฐ์ค์น๊ฐ ๋ถ์ด์ ์ด๋ํ๋ค๊ฑฐ๋, ์ด๋ ๊ณผ์ ์์ ์ฌ๋ฌ ์ ์ฝ์ด ์์ ๊ฒฝ์ฐ ํจ๊ณผ์ ์ด๋ค.
- ํ์ ์๊ฐ์ ๋ ๊ฑธ๋ฆฌ๊ธด ํ์ง๋ง, ๊ฐ์ค์น์ ๋ํ ๋ณ์๋ฅผ ์ง์ํด์ ๊ด๋ฆฌํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
- ๊ตฌํ ์, ์ฝ๋๊ฐ ์ข ๋ ์ง๊ด์ ์ด์ฌ์ BFS ๋นํด ์ดํดํ๊ธฐ ์ฝ๋ค๊ณ ํ๋ค.
DFS ์์
# DFS ๋ฉ์๋ ์ ์
def dfs(graph, v, visited):
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[v] = True
print(v, end=' ')
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ(2์ฐจ์ ๋ฆฌ์คํธ)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ(1์ฐจ์ ๋ฆฌ์คํธ)
visited = [False] * 9
# ์ ์๋ DFS ํจ์ ํธ์ถ
dfs(graph, 1, visited)
# --> 1 2 7 6 8 3 4 5
# dfs(1,visited)๋ ๊ฐ๋ฅํ๋ค.
BFS(Breadth-First Search)
- BFS๋ ๋๋น ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
BFS๋ ์ ์ ์ ์ถ ๋ฐฉ์์ธ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ธ ๋ค์ ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ค.
- ๋ ์ด์ 2๋ฒ์ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
๐BFS ํน์ง
- ๋๋น ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ธ BFS๋ ํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค.
- ์ค์ ๋ก๋ deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ ํ์์ ์ํํจ์ ์์ด O(N)์ ์๊ฐ์ด ์ผ์ค๋๋ค.
- ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ ์๊ฐ์ DFS๋ณด๋ค ์ข์ ํธ์ด๋ค.
- ๊ฐ์ ๊ฐ์ด ๋ชจ๋ ๊ฐ๊ณ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
BFS ์์
from collections import deque
# BFS ๋ฉ์๋ ์ ์
def bfs(graph, start, visited):
# ํ(Queue) ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque([start])
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[start] = True
# ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while queue:
# ํ์์ ํ๋์ ์์๋ฅผ ๋ฝ์ ์ถ๋ ฅํ๊ธฐ
v = queue.popleft()
print(v, end=' ')
# ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ํ ์์๋ค์ ํ์ ์ฝ์
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ํํ(2์ฐจ์ ๋ฆฌ์คํธ)
graph = [
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ํํ (1์ฐจ์ ๋ฆฌ์คํธ)
visited = [False]*9
# ์ ์๋ BFS ํจ์ ํธ์ถ
bfs(graph, 1, visited)
# --> 1 2 3 8 7 4 5 6
# bfs(1,visited)๋ ๊ฐ๋ฅํ๋ค.
DFS, BFS ์ ๋ฆฌ
ย | DFS | BFS |
---|---|---|
๋์ ์๋ฆฌ | ์คํ | ํ |
๊ตฌํ ๋ฐฉ๋ฒ | ์ฌ๊ท ํจ์ ์ด์ฉ | ํ ์๋ฃ๊ตฌ์กฐ ์ด์ฉ |
- DFS์ BFS๋ฅผ ์ค๋ช ํ๋๋ฐ ์ ํ์ ์ธ ๊ทธ๋ํ ๊ทธ๋ฆผ์ ์ด์ฉํ๋๋ฐ 1์ฐจ์ ๋ฐฐ์ด์ด๋ 2์ฐจ์ ๋ฐฐ์ด ๋ํ ๊ทธ๋ํ ํํ๋ก ์๊ฐํ๋ฉด ์์ํ๊ฒ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค. ํนํ DFS, BFS ๋ฌธ์ ์ ํ์ด ๊ทธ๋ฌํ๋ค.
์์) ๊ฒ์๋งต์ด 3X3 ํํ 2์ฐจ์ ๋ฐฐ์ด, ์ํ์ข์ฐ๋ก๋ง ์ด๋ ๊ฐ๋ฅ
์ฝ๋ฉ ํ ์คํธ ์ค 2์ฐจ์ ๋ฐฐ์ด ํ์ ๋ฌธ์ ๋ฅผ ๋ง๋ ์ ์ด๋ฌํ ํํ๋ก ํํํ ๋ค์ ํ์ด๋ฒ์ ๊ณ ๋ฏผํ๋๋ก ํ์.
๋๊ธ๋จ๊ธฐ๊ธฐ