[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ ํ์์ ์ํ DFS์ BFS - ํ์ด์ฌ(Python)
๊ทธ๋ํ ํํ
๊ทธ๋ํ๋ ๋ ธ๋(Node)์ ๊ฐ์ (Edge)๋ก ํํ๋๋ฉฐ ์ด๋ ๋ ธ๋๋ฅผ ์ ์ (Vertex)๋ผ๊ณ ๋ ํ๋ค.
ํ๋ก๊ทธ๋๋ฐ์์ ๊ทธ๋ํ๋ '์ธ์ ํ๋ ฌ'๊ณผ '์ธ์ ๋ฆฌ์คํธ' 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ํํํ ์ ์๋ค.
- ์ธ์ ํ๋ ฌ : 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
- ๊ฐ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํํ๋ฅผ ๊ธฐ๋กํ์ฌ ์ ์ฅ
INF = 999999999 # ๋ฌดํ์ ๋น์ฉ ์ ์ธ
# 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ํตํด ์ธ์ ํ๋ ฌ ํํ
graph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0]
]
print(graph)
- ์ธ์ ๋ฆฌ์คํธ : ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
- ๋ชจ๋ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐํ์ฌ ์ ์ฅ
# ํ์ด 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)
์ธ์ ํ๋ ฌ VS ์ธ์ ๋ฆฌ์คํธ
- ์ธ์ ํ๋ ฌ์ ๋ชจ๋ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋ ธ๋ ๊ฐ์๊ฐ ๋ง์์๋ก ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น but ๋ ธ๋1๊ณผ ๋ ธ๋2์ ์ฐ๊ฒฐ์ graph[๋ ธ๋1][๋ ธ๋2]๋ก ๋น ๋ฅด๊ฒ ํ์ธ ๊ฐ๋ฅ
- ์ธ์ ๋ฆฌ์คํธ๋ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ง์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉ but ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋ ์๋๊ฐ ๋๋ฆผ
- ํน์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ธ์ ๋ ธ๋๋ฅผ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ(DFS, BFS)๋ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ด ๋ ์ ๋ฆฌ
DFS ( Depth-First Search )
DFS (Depth-First Search)๋ ๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํน์ ํ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค๊ฐ ํน์ ํ ์ํฉ์์ ์ต๋ํ ๊น์์ด ๋ค์ด๊ฐ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ๋ค์ ๋์๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ์ํ๋ค.
DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ธ์ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค. (pop)
- 2๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
# DFS ๋ฉ์๋ ์ ์
def dfs(graph, v, visited):
visited[v] = True # ํ์ฌ ๋
ธ๋(v) ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
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]
]
# ๊ฐ ๋
ธ๋์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฆฌ์คํธ
visited = [False] * 9
# DFS ํจ์ ํธ์ถ (์์ ๋
ธ๋: 1)
dfs(graph, 1, visited)
BFS ( Breadth-First Search )
BFS ( Breadth-First Search )๋ ๋๋น ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์ ์์ ๋ ธ๋์ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
BFS๋ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ํ๋ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- 2๋ฒ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
from collections import deque
# BFS ๋ฉ์๋ ์ ์
def bfs(graph, start, visited):
queue = deque([start]) # ํ ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
visited[start] = True # ์์ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
# ํ๊ฐ empty๋ ๋๊น์ง ๋ฐ๋ณต
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]
]
# ๊ฐ ๋
ธ๋์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฆฌ์คํธ
visited = [False] * 9
# DFS ํจ์ ํธ์ถ (์์ ๋
ธ๋: 1)
bfs(graph, 1, visited)
DFS / BFS ๋ฌธ์ ์ ํ
- ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํด์ผ ํ๋ ๋ฌธ์
- DFS/BFS ๋ ๋ฐฉ๋ฒ ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ์ง๋ง ํ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ ์ ์ ๋ค ํ์ธํด์ผ ํ๋ค๋ฉด DFS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์
- ๊ฒฝ๋ก์ ํน์ง์ ์ ์ฅํด์ผ ํ๋ ๋ฌธ์
- ์๋ฅผ ๋ค์ด, ์ซ์๊ฐ ์ ํ์๋ 1์์ 10๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ๋ ๊ฐ์ ์ซ์๋ฅผ ์ง๋์ค๋ฉด ์๋๋ค๋ ์กฐ๊ฑด์ด ์๋ ๋ฌธ์ ์ ๊ฐ์ด ๊ฒฝ๋ก์ ํน์ง์ ์ ์ฅํด์ผํ ๊ฒฝ์ฐ์๋ DFS๋ฅผ ์ฌ์ฉํ๋ค.
- ์ต๋จ๊ฑฐ๋ฆฌ ๋ฌธ์
- a์ ์ ๋ถํฐ b์ ์ ๊น์ง ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผํ๋ ๊ฒฝ์ฐ์๋ BFS๊ฐ ์ ๋ฆฌํ๋ค. DFS๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ฒ์ ๋ฐ๊ฒฌํ ๊ฒฝ๋ก๊ฐ ์ต๋จ๊ฑฐ๋ฆฌ๋ผ๋ ๋ณด์ฅ์ด ์์ง๋ง BFS๋ ๊ฐ์ฅ ๋จผ์ ์ฐพ์๋ธ ๊ฒฝ๋ก๊ฐ ๊ณง ์ต๋จ๊ฑฐ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค.