DFS/BFS ๋ฅผ ์ํ ์๋ฃ๊ตฌ์กฐ ๊ธฐ์ด : ์คํ, ํ, ์ฌ๊ทํจ์
ํ์ : ๋ง์ ์์ ๋ฐ์ดํฐ ์ค์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์
๋ํ์ ์ธ ํ์ ์๊ณ ๋ฆฌ์ฆ DFS, BFS - ๊ธฐ๋ณธ ์๋ฃ๊ตฌ์กฐ์ธ ์คํ๊ณผ ํ์๋ํ ์ดํด ํ์
์คํ
์คํ : ์ ์ ํ์ถ
ํ์ด์ฌ์์ ์คํ์ ์ด์ฉํ ๋๋ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
๊ธฐ๋ณธ ๋ฆฌ์คํธ์์ append()์ pop() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์คํ ์๋ฃ๊ตฌ์กฐ์ ๋์ผํ๊ฒ ๋์ํ๋ค.
append() ๋ฉ์๋๋ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ๋ค์ชฝ์ ์ฝ์ , pop() ๋ฉ์๋๋ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ๋ค์ชฝ์์ ๋ฐ์ดํฐ ๊บผ๋ด๊ธฐ ๋๋ฌธ
ํ
ํ : ์ ์ ์ ์ถ
collections ๋ชจ๋์์ ์ ๊ณตํ๋ deque ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์.
deque๋ ์คํ๊ณผ ํ์ ์ฅ์ ์ ๋ชจ๋ ์ฑํํ ๊ฒ์ธ๋ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋นผ๋ ์๋๊ฐ ๋ฆฌ์คํธ ์๋ฃํ์ ๋นํด ํจ์จ์ ์ด๋ฉฐ
queue ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ๋ค.
๋ํ deque ๊ฐ์ฒด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ ํ๋ค๋ฉด list() ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
from collections import deque
# ํ ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque()
queue.append(5)
queue.append(3)
queue.append(2)
pop.left()
queue.append(1)
queue.popleft()
print(queue) # ๋จผ์ ๋ค์ด์จ ์์๋๋ก ์ถ๋ ฅ
queue.reverse() # ๋ค์ ์ถ๋ ฅ์ ์ํด ์ญ์์ผ๋ก ๋ฐ๊ฟ
print(queue) # ๋์ค์ ๋ค์ด์จ ์์๋ถํฐ ์ถ๋ ฅ
list(queue) # deque ๊ฐ์ฒด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ๋ณ๊ฒฝ
์ฌ๊ท ํจ์
DFS์ BFS๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์ฌ๊ท ํจ์๋ ์ดํดํ๊ณ ์์ด์ผ ํ๋ค.
์ฌ๊ท ํจ์๋ฅผ ๋ฌธ์ ํ์ด์์ ์ฌ์ฉํ ๋๋ ์ฌ๊ท ํจ์๊ฐ ์ธ์ ๋๋ ์ง, ์ข ๋ฃ ์กฐ๊ฑด์ ๊ผญ ๋ช ์ํด์ผํ๋ค๋ ๊ฒ์ ์ฃผ์ํ์.
์ปดํจํฐ ๋ด๋ถ์์ ์ฌ๊ท ํจ์์ ์ํ์ ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค.
ํจ์๋ฅผ ๊ณ์ ํธ์ถํ์ ๋ ๊ฐ์ฅ ๋ง์ง๋ง์ ํธ์ถํ ํจ์๊ฐ ๋จผ์ ์ํ์ ๋๋ด์ผ ๊ทธ ์์ ํจ์ ํธ์ถ์ด ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํด์ผํ๋ ์๋น์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ฐํธํ๊ฒ ๊ตฌํ๋ ์ ์๋ค. ex ) DFS
ํ์ ์๊ณ ๋ฆฌ์ฆ DFS/BFS
๊ทธ๋ํ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
๋ ธ๋(=์ ์ ), ๊ฐ์
๊ทธ๋ํ ํ์ : ํ๋์ ๋ ธ๋๋ฅผ ์์์ผ๋ก ๋ค์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ
๊ทธ๋ํ๋ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ํํํ ์ ์๋ค.
- ์ธ์ ํ๋ ฌ (Adjacency Matrix): 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ ํํ
- ์ธ์ ๋ฆฌ์คํธ (Adjacency List): ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํ
์ธ์ ํ๋ ฌ ๋ฐฉ์
์ธ์ ํ๋ ฌ ๋ฐฉ์์ 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํํ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฉ์.
ํ์ด์ฌ์์ 2์ฐจ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ ์ ์๋ค.
์ฐ๊ฒฐ์ด ๋์ด ์์ง ์์ ๋ ธ๋ ๋ผ๋ฆฌ๋ ๋ฌดํ์ ๋น์ฉ์ด๋ผ๊ณ ์์ฑํ๋ค. ์ค์ ์ฝ๋์์๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ ๋ต์ด ๋ ์ ์๋ ํฐ ๊ฐ ์ค์์ 999999999, 987654321 ๋ฑ์ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ธ์ ํ๋ ฌ ๋ฐฉ์ ์์
INF = 999999999 # ๋ฌดํ์ ๋น์ฉ ์ ์ธ
# 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ์ธ์ ํ๋ ฌ ํํ
graph = [
[0, 7, 5],
[7, 0, INF],
[5, INF, 0]
]
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์์๋ ๋ชจ๋ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐํ์ฌ ์ ์ฅํ๋ค.
์ธ์ ๋ฆฌ์คํธ๋ '์ฐ๊ฒฐ ๋ฆฌ์คํธ'๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ๊ตฌํํ๋ค.
C++๋ ์๋ฐ ๋ฑ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๊ธฐ๋ฅ์ ์ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ๋ฐ๋ฉด,
ํ์ด์ฌ์ ๊ธฐ๋ณธ ์๋ฃํ์ธ ๋ฆฌ์คํธ ์๋ฃํ์ด append()์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ ํต์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์์ ๋ฐฐ์ด๊ณผ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.
ํ์ด์ฌ์ผ๋ก ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ๊ทธ๋ํ๋ฅผ ํํํ๊ณ ์ ํ ๋๋ ๋จ์ํ 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค๋ ์ ๋ง ๊ธฐ์ตํ์.
# ํ์ด 3๊ฐ์ธ 2์ฐจ์ ๋ฆฌ์คํธ๋ก ์ธ์ ๋ฆฌ์คํธ ํํ
graph = [[] for _ in range(3)]
# ๋
ธ๋ 0์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ(๋
ธ๋, ๊ฑฐ๋ฆฌ)
graph[0].append((1, 7))
graph[0].append((2, 5))
# ๋
ธ๋ 1์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ(๋
ธ๋, ๊ฑฐ๋ฆฌ)
...
# ๋
ธ๋ 2์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ(๋
ธ๋, ๊ฑฐ๋ฆฌ)
...
์ธ์ ํ๋ ฌ ๋ฐฉ์, ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์ ์ฐจ์ด
๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด
์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋ชจ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋ ธ๋ ๊ฐ์๊ฐ ๋ง์์๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถํ์ํ๊ฒ ๋ญ๋น๋๋ค.
๋ฐ๋ฉด ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ง์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
์๋ ์ธก๋ฉด
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋นํด ํน์ ํ ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋ ์๋๊ฐ ๋๋ฆฌ๋ค.
์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
DFS
Depth-First Search, ๊น์ด ์ฐ์ ํ์
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. (๋ฐฉ๋ฌธ์ฒ๋ฆฌ : ์คํ์ ํ๋ฒ ์ฝ์ ๋์ด ์ฒ๋ฆฌ๋ ๋ ธ๋๊ฐ ๋ค์ ์ฝ์ ๋์ง ์๊ฒ ์ฒดํฌ)
- ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ธ์ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- 2๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
์ฝ๋ฉ ํ ์คํธ์์๋ ๋ฒํธ๊ฐ ๋ฎ์ ์์๋ถํฐ ์ฒ๋ฆฌํ๋๋ก ๋ช ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ผ๋ฏ๋ก, ๊ดํ์ ์ผ๋ก ๋ฒํธ๊ฐ ๋ฎ์ ์์๋ถํฐ ์ฒ๋ฆฌํ๋๋ก ๊ตฌํํ๋ฉด ์ข๋ค.
๋ ธ๋์ ํ์ ์์ = ์คํ์ ๋ค์ด๊ฐ ์์
DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค.
์ค์ ๋ก๋ ์คํ์ ์ฐ์ง ์์๋ ๋๋ฉฐ ํ์์ ์ํํจ์ ์์ด์ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N๊ฐ์ธ ๊ฒฝ์ฐ O(N)์ ์๊ฐ์ด ์์๋๋ค.
DFS๋ ์คํ์ ์ด์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๊ตฌํ์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ์ ๋ ๋งค์ฐ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌํํ ์ ์๋ค.
# DFS ๋ฉ์๋ ์ ๋ฆฌ
def dfs(graph, v, visited):
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[v] = Tre
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)
BFS
breadth First Search, ๋๋น ์ฐ์ ํ์
๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ.
BFS ๊ตฌํ์๋ ์ ์ ์ ์ถ ๋ฐฉ์์ธ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ ์์ด๋ค.
์ธ์ ํ ๋ ธ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ ๋ฃ๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋จผ์ ๋ค์ด์จ ๊ฒ์ด ๋จผ์ ๋๊ฐ๊ฒ ๋์ด, ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์์ ์งํํ๊ฒ ๋๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- 2๋ฒ์ ๊ณผ์ ์ ๋ ์ด์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ
ํ์์ ์ํํจ์ ์์ด O(N)์ ์๊ฐ์ด ์์๋๋ค.
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ ์๊ฐ์ DFS๋ณด๋ค ์ข์ ํธ์ด๋ค.
* ์ฌ๊ท ํจ์๋ก DFS๋ฅผ ๊ตฌํํ๋ฉด ์ปดํจํฐ ์์คํ ์ ๋์ ํน์ฑ์ ์ค์ ํ๋ก๊ทธ๋จ์ ์ํ ์๊ฐ์ ๋๋ ค์ง ์ ์๋ค. ๋ฐ๋ผ์ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ์๊ฐ ๋ณต์ก๋๋ฅผ ์ํํ๋ ํ ํฌ๋์ด ํ์ํ ๋๋ ์๋ค. ๋ค๋ง, ์ผ๋ฐ์ ์ธ ์ฝํ ์์๋ ๋ณดํต 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 = [
...
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ (1์ฐจ์ ๋ฆฌ์คํธ)
visited = [False] * 9
# ์ ์๋ BFS ํจ์ ํธ์ถ
bfs(graph, 1, visited)
์ฝํ ์ค 2์ฐจ์ ๋ฐฐ์ด์์์ ํ์ ๋ฌธ์ ๋ฅผ ๋ง๋๋ฉด ๊ทธ๋ํ ํํ๋ก ๋ฐ๊ฟ์ ์๊ฐํ๋ฉด ํ์ด ๋ฐฉ๋ฒ์ ์กฐ๊ธ ๋ ์ฝ๊ฒ ๋ ์ฌ๋ฆด ์ ์๋ค.
์ฝํ ์์ ํ์ ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ๊ทธ๋ํ ํํ๋ก ํํํ ๋ค์ ํ์ด๋ฒ์ ๊ณ ๋ฏผํ๋๋ก ํ์!
์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ