[์๋ฃ๊ตฌ์กฐ] DFS(๊น์ด ์ฐ์ ํ์) & BFS(๋๋น ์ฐ์ ํ์) (in python)
๐ก ๊ทธ๋ํ ํ์
- ํ๋์ ๋ ธ๋์์ ์์ํ์ฌ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ ์ ๋ค์ ํ ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ ๊ฒ
๐ก DFS (๊น์ด ์ฐ์ ํ์)
DFS๋ ์ด๋ฆ ๊ทธ๋๋ก ๊น์ด๋ฅผ ์ฐ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ ํ ์ํ๋ผ๊ณ ๋ ํ ์ ์๋๋ฐ ์ฝ๊ฒ ๋งํ๋ฉด ์๋ ๊ทธ๋ฆผ์ฒ๋ผ, "๋ฃจํธ ๋ ธ๋ -> ์ผ์ชฝ ์๋ธํธ๋ฆฌ -> ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ" ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ ๋ฐฉ์์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๊ณผ์ ์ด ์ฌ๊ท์ ์ผ๋ก ๋ฐ๋ณต๋๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค. ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ๋ฐฉ๋ฌธํ๋ฉด ์ผ์ชฝ ์๋ธํธ๋ฆฌ์์๋ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ ๊ทธ ๋ฃจํธ ๋ ธ๋์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ -> ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ๋ ๋ฐฉ์์ด๋ค.
์์๋ฅผ ํตํด ๋์ฑ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ฐ, ๋ง์ฝ ๊ทธ๋ํ๊ฐ ์์ ๊ฐ๋ค๊ณ ํ๋ฉด DFS์ ์ํ ์์๋ 0 - 1 - 2 - 3 - 4 - 5๊ฐ ๋๋ค.
- ๋ฃจํธ ๋ ธ๋์ 0 ๋ฐฉ๋ฌธ
- 0์ด ๋ฃจํธ ๋ ธ๋์ธ ํธ๋ฆฌ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ธ 1์ ๋ฐฉ๋ฌธ -> 1์ ์์๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก 1์ด ๋ฃจํธ ๋ ธ๋์ธ ์๋ธํธ๋ฆฌ ํ์
- 1์ด ๋ฃจํธ ๋ ธ๋์ธ ํธ๋ฆฌ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ธ 2๋ฅผ ๋ฐฉ๋ฌธ -> 2๋ ๋ฆฌํ๋ ธ๋์ด๋ฏ๋ก ๋์ด์ ํ์ X
- 1์ด ๋ฃจํธ ๋ ธ๋์ธ ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ธ 3์ ๋ฐฉ๋ฌธ -> 3์ ๋ฆฌํ๋ ธ๋์ด๋ฏ๋ก ๋์ด์ ํ์ X
- 0์ด ๋ฃจํธ ๋ ธ๋์ธ ํธ๋ฆฌ์ ์ค๋ฅธ์ชฝ ์๋ธํธ๋ฆฌ์ธ 4๋ฅผ ๋ฐฉ๋ฌธ -> 4๋ ์์๋ ธ๋๊ฐ ์์ผ๋ฏ๋ก 4๊ฐ ๋ฃจํธ ๋ ธ๋์ธ ์๋ธํธ๋ฆฌ ํ์
- 4๊ฐ ๋ฃจํธ ๋ ธ๋์ธ ํธ๋ฆฌ์ ์ผ์ชฝ ์๋ธํธ๋ฆฌ์ธ 5๋ฅผ ๋ฐฉ๋ฌธ -> 5๋ ๋ฆฌํ๋ ธ๋์ด๋ฏ๋ก ๋์ด์ ํ์ X
- ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์์ผ๋ฏ๋ก, ํ์ ์ข ๋ฃ
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
visit = [False] * (n + 1) # ๋ฐฉ๋ฌธํ ๋
ธ๋๋ฅผ ํ์ํ ๋ฆฌ์คํธ ์์ฑ
# dfs ํจ์
def dfs(node):
visit[node] = True # ๋ฐฉ๋ฌธ ๋
ธ๋ True๋ก ํ์
for i in graph[node]: # ๋ฐฉ๋ฌธํ ๋
ธ๋์ ๋ชจ๋ ์์๋
ธ๋์ ๋ํด
if not visit[i]: # ๋ง์ฝ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋ผ๋ฉด
dfs(i) # ๋ฐฉ๋ฌธํ์ง ์์ ์์๋
ธ๋์ ๋ํด dfs ์ค์
๊ทธ๋ฆฌ๊ณ , ํด๋น ํจ์๋ฅผ ํฌ๊ฒ ๋๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋์ด ํ์ฉํด๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
(1) ํธ๋ฆฌ์ ๊ฐ์๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๋ >> ์๋ง ์ด๊ฒ ๋๋ถ๋ถ
ํธ๋ฆฌ์ ๊ฐ์๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ ์๋ฏธ๋ ์ด์ฐจ์ ๋ฐฐ์ด ์์์ ๋๊ฐ์ , ์์์ผ๋ก ์์ง์ผ ์ ์์ ๋, ์์ง์ผ ์ ์๋ ์์ญ์ ๊ฐ์ ์ ๋๋ก ํํ๋๋ ๊ฒ ๊ฐ๋ค. ์ค์ ๋ก ํ์๋ ๋ฌธ์ ๋ฅผ ์์๋ก ๋ค์ด๋ณด์๋ฉด, ๋ฐฐ์ถ๊ฐ ์ด์ฐจ์ ๋ฐฐ์ด ์์ ๋ฌ์ฑ๋ฌ์ฑ ์ฌ์ด์ ธ์๋๋ฐ & ์ด์ถฉ์ ์ ํจ๊ณผ๊ฐ ๋๊ฐ์ , ์์๊น์ง๋ง ์์ ๋, ๋ชจ๋ ๋ฐฐ์ถ์ ์ด์ถฉ์ ์ ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์ํด ํ์ํ ์ด์ถฉ์ ์ ์ด ๊ฐ์๋ ๋ช ๊ฐ์ธ๊ฐ์ ๋๋ !
์ด๋ด๋๋ "์ฐ๊ฒฐ๋ ๊ทธ๋ํ๋ฅผ ํ์ํ๊ณ >> ํ์์ด ๋๋๋ฉด count + 1 >> ๋ค์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋์ ๋ํด dfs๋ฅผ ์ ์ฉํ์ฌ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๊ทธ๋ํ๋ฅผ ํ์ํ๊ณ >> ํ์์ด ๋๋๋ฉด count + 1"์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
cnt = 0
for i in range(1, n + 1): # ๋ชจ๋ ๋
ธ๋์ ๋ํด ๋ฐ๋ณต๋ฌธ ์คํ
if not visited[i]: # ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋์ด๋ฉด
if not graph[i]: # ์ ์ ์ ์กด์ฌํ์ง๋ง & ์ฐ๊ฒฐ๋ ์ ์ ์ด ์์ ๋ = ํ๋์ ๋
ธ๋๋ก ์ด๋ฃจ์ด์ง ๊ทธ๋ํ์ผ ๋
cnt += 1 # count + 1
visited[i] = True # ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์
else: # ์ฐ๊ฒฐ๋ ์ ์ ์ด ์์ผ๋ฉด
dfs(i) # ๋
ธ๋์ ๋ํด dfs ์คํ
cnt += 1 # count + 1
print(cnt)
์ฌ์ค ์๋์ฒ๋ผ๋ ์ฝ๋๋ฅผ ์งค ์ ์๋๋ฐ, ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด ์๋ ์ ์ ์ ๋ํด ์ฌ๊ทํจ์๋ฅผ ๊ตณ์ด ํธ์ถํ ํ์๋ ์์ผ๋ ์์ฒ๋ผ ์ฝ๋๋ฅผ ์ง๋๊ฒ ๋ ํจ์จ์ ์ผ ๊ฒ ๊ฐ๋ค.
cnt = 0
for i in range(1, n + 1): # ๋ชจ๋ ๋
ธ๋์ ๋ํด ๋ฐ๋ณต๋ฌธ ์คํ
if not visited[i]: # ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋์ด๋ฉด
dfs(i) # ๋
ธ๋์ ๋ํด dfs ์คํ
cnt += 1 # count + 1
print(cnt)
(2) ํธ๋ฆฌ์ ๊ฐ์๊ฐ ํ๋์ผ ๋
๊ทธ๋ฅ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋ฆฌ๋ฅผ ํ์ํ๊ณ ์ ํ ๋ ์ฌ์ฉํ ์ ์๊ณ , ์์๋ ธ๋๋ง ์๋์ฒ๋ผ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
dfs(1)
๐ก BFS (๋๋น ์ฐ์ ํ์)
BFS๋ ์ด๋ฆ ๊ทธ๋๋ก ๋๋น๋ฅผ ์ฐ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ ๋ฒจ ์ ์ํ๋ผ๊ณ ๋ ํ ์ ์๋๋ฐ ์ฝ๊ฒ ๋งํ๋ฉด ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฎ์ ๋ ๋ฒจ๋ถํฐ ์ฐจ๋ก๋๋ก ์ํํ๋ ๋ฐฉ์์ด๋ค. 0๋ ๋ฒจ์ ๋ ธ๋๋ฅผ ํ์ -> 1๋ ๋ฒจ์ ๋ ธ๋๋ฅผ ํ์ -> 2๋ ๋ฒจ์ ๋ ธ๋๋ฅผ ํ์ํ๋ ์์ผ๋ก !
์์๋ฅผ ํตํด ํ์ธํด๋ณด๋ฉด, BFS์ ์ํ ์์๋ 0 - 1 - 4 - 2 - 3 - 5 ๊ฐ ๋๊ณ , DFS๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๋ค.
- ๋ ๋ฒจ 0์ 0 ํ์
- ๋ ๋ฒจ 1์ 1 -> 4 ํ์
- ๋ ๋ฒจ 2์ 2 -> 3 -> 5 ํ์
- ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ผ๋ฏ๋ก ํ์ ์ค์ง
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
from collections import deque
# ๋ฐฉ๋ฌธ ๋
ธ๋ ๋ฆฌ์คํธ ์์ฑ
visit = [False] * (n + 1)
# bfs ํจ์
def bfs(node):
visit[node] = True # ์์ ๋
ธ๋ ๋ฐฉ๋ฌธ
queue = deque([node]) # queue ์์ฑ
while queue: # queue์ ์์๊ฐ ํฌํจ๋์ด ์๋ ๋์
v = queue.popleft() # queue์ ๊ฐ์ฅ ์ผ์ชฝ์ ๊ฐ์ ์ถ์ถ (๊ฐ์ฅ ์ต๊ทผ์ ์ถ๊ฐ๋ ๊ฐ)
for i in graph[v]: # v์ ๋ชจ๋ ์์๋
ธ๋์ ๋ํด
if not visit[i]: # ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๋
queue.append(i) # queue์ ์ถ๊ฐํ๊ณ
visit[i] = True # ๋ฐฉ๋ฌธํ์์ ํ์ํด์ค
์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ฉฐ ์คํ๋๋ DFS์ ๋ฌ๋ฆฌ while๋ฌธ์ ํตํด ์คํ๋๊ธฐ ๋๋ฌธ์ ํจ์๋ฅผ ํ ๋ฒ๋ง ํธ์ถํ๋ฉด ๋๋ค. ๊ทธ๋์์ธ์ง, BFS์ DFS๋ฅผ ๋ชจ๋ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์์ ๋ BFS๊ฐ ์ฑ๋ฅ์ด ๋ ์ข์๋ ์ ์ด ๋ง์๋ค. ํ์ด์ ๋ฐฉ์์ ์์ DFS์ฒ๋ผ ๋์ผํ๊ฒ ํธ๋ฆฌ๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๋ & ํ ๊ฐ์ผ ๋๋ก ๋๋์ด ํ์ฉํ ์ ์๋ค. ์ค๋ช ์ ์์ ์ฐธ๊ณ !
(1) ํธ๋ฆฌ์ ๊ฐ์๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๋ >> ์๋ง ์ด๊ฒ ๋๋ถ๋ถ
cnt = 0
for i in range(1, n + 1): # ๋ชจ๋ ๋
ธ๋์ ๋ํด ๋ฐ๋ณต๋ฌธ ์คํ
if not visited[i]: # ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋์ด๋ฉด
if not graph[i]: # ์ ์ ์ ์กด์ฌํ์ง๋ง & ์ฐ๊ฒฐ๋ ์ ์ ์ด ์์ ๋ = ํ๋์ ๋
ธ๋๋ก ์ด๋ฃจ์ด์ง ๊ทธ๋ํ์ผ ๋
cnt += 1 # count + 1
visited[i] = True # ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์
else: # ์ฐ๊ฒฐ๋ ์ ์ ์ด ์์ผ๋ฉด
bfs(i) # ๋
ธ๋์ ๋ํด bfs ์คํ
cnt += 1 # count + 1
print(cnt)
(2) ํธ๋ฆฌ์ ๊ฐ์๊ฐ ํ๋์ผ ๋
bfs(1)
๐ก ํ์์์ : DFS & BFS ๋น๊ต
- DFS : F - B - A - D - C - E - G - I - H
- BFS : F - B - G - A - D - I - C - E - H