DFS์ BFS๋ ๋ํ์ ์ธ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ฌ๊ธฐ์ 'ํ์'์ ๋ง์ ์์ ๋ฐ์ดํฐ ์ค์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ ๋ปํ๋ค.
DFS์ BFS๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ์คํ, ํ ์๋ฃ๊ตฌ์กฐ์ ์ฌ๊ทํจ์์ ๋ํด ์์งํด์ผ ํ๋ค.
์คํ
- ์ ์ ํ์ถ (๋จผ์ ๋ค์ด์ค๋ฉด ๋์ค์ ๋๊ฐ)
- DFS ๊ตฌํ์ ์ฌ์ฉ๋จ
stack = []
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()
print(stack) # ์ตํ๋จ ์์๋ถํฐ ์ถ๋ ฅ (๋ค์ด์จ ์์ผ๋ก) -> [5, 2, 3, 1]
print(stack[::-1]) # ์ต์๋จ ์์๋ถํฐ ์ถ๋ ฅ (์ต๊ทผ์ ๋ค์ด์จ) -> [1, 3, 2, 5]
# or
stack.reverse()
print(stack()) # [1, 3, 2, 5]
ํ
- ์ ์ ์ ์ถ (๋จผ์ ๋ค์ด์ค๋ฉด ๋จผ์ ๋๊ฐ)
- BFS ๊ตฌํ์ ์ฌ์ฉ๋จ
from collections import deque
queue = deque() # ๊ฒฐ๊ณผ: deque([])
queue2 = deque([1]) # ๊ฒฐ๊ณผ: deque([1])
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()
print(queue()) # ๋ค์ด์จ ์์ผ๋ก ์ถ๋ ฅ -> deque([3, 7, 1, 4])
queue.reverse() # ์ญ์
print(queue()) # ๋์ค์ ๋ค์ด์จ ์์ผ๋ก -> deque([4, 1, 7, 3])
์ฌ๊ทํจ์
- ์ข ๋ฃ ์กฐ๊ฑด์ ๋ฐ๋์ ๋ช ์ํด์ผ ํจ: ๋ช ์ํ์ง ์์ผ๋ฉด ๋ฌดํํ ํธ์ถ๋๋ค๊ฐ RecursionError ๋ฐ์
- ํจ์์ ์ ๋ณด๊ฐ ์คํ ํ๋ ์์ ๋ด๊ฒจ ์ฐจ๋ก๋๋ก ํธ์ถ๋์๋ค๊ฐ ๊ฐ์ฅ ๋ง์ง๋ง์ ํธ์ถ๋ ํจ์๋ถํฐ ์ข ๋ฃ๋จ → ์คํ ํํ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ DFS ๊ตฌํ์ ์ฌ์ฉ๋จ
- ๋ชจ๋ ์ฌ๊ท ํจ์๋ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด ๋์ผํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ (๋ฐ๋๋ ์ฑ๋ฆฝ)
def recursive_function(i):
if i == 100:
return
print(f'{i}๋ฒ์งธ ์ฌ๊ท ํจ์์์ {i+1}๋ฒ์งธ ์ฌ๊ท ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.')
recursive_function(i + 1)
print(f'{i}๋ฒ์งธ ์ฌ๊ท ํจ์๋ฅผ ์ข
๋ฃํฉ๋๋ค.')
recursive_function(1)
DFS
- Depth-First Search, ๊น์ด ์ฐ์ ํ์ → ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
๋์ ๊ณผ์
- ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ , ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ์คํ์ ์ต์๋จ(๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์จ) ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋ ์ค์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด, ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด, ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
- ๋ ์ด์ 2๋ฒ์ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
⇒ ์ฆ, ๋งค๋ฒ ์ต์๋จ ์์๋ฅผ ๊ธฐ์ค์ผ๋ก, ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ธ์ ํ ๋ ธ๋๋ก๋ ๋ฐฉ๋ฌธ ์ํ
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 = [
[], # ๋
ธ๋ ๋ฒํธ๊ฐ 1๋ถํฐ ์์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ๋น์๋
[2, 3, 8], # 1๋ฒ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ๋ฆฌ์คํธ
[1, 7], # 2๋ฒ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ๋ฆฌ์คํธ
[1, 4, 5], # 3๋ฒ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ๋ฆฌ์คํธ
[3, 5], # 4๋ฒ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ๋ฆฌ์คํธ
[3, 4], # 5๋ฒ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ๋ฆฌ์คํธ
[7], # 6๋ฒ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ๋ฆฌ์คํธ
[2, 6 ,8], # 7๋ฒ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ๋ฆฌ์คํธ
[1, 7] # 8๋ฒ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ๋ฆฌ์คํธ
]
visited = [False] * 9 # graph์ ๊ฐ์ ํฌ๊ธฐ๋ก (0~8), ๋ฐฉ๋ฌธ์ 1๋ถํฐ
dfs(graph, 1, visited) # 1 2 7 6 8 3 4 5
BFS
- Breadth-First Search, ๋๋น ์ฐ์ ํ์ → ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ํน์ ์กฐ๊ฑด์์์ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋จ
๋์ ๊ณผ์
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ , ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋จผ์ ๋ค์ด์จ ๋ ธ๋ ํ๋๋ฅผ ๊บผ๋ธ ๋ค์, ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํ๋ค.
- ๋ ์ด์ 2๋ฒ์ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
DFS vs BFS
DFS: ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ํ๋์ฉ ํ์ ๋ฃ์ผ๋ฉฐ ๋ฐฉ๋ฌธ ์ํ
BFS: ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ค์ ์ ๋ถ ํ ๋ฒ์ ํ์ ๋ฃ์
BFS ์์
from collections import deque
def bfs(graph, start, visited):
# Step 1) ์์ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
queue = deque([start])
visited[start] = True
# Step 3) ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while queue:
# Step 2)
# ๋จผ์ ๋ค์ด์จ ์์ ํ๋ ๋ฝ์ ์ถ๋ ฅ
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
bfs(graph, 1, visited) # 1 2 3 8 7 4 5 6
'์ฝํ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ด์ฝํ /Python] ์๋ฃ์ ์ผ๋ ค ๋จน๊ธฐ (DFS) (0) | 2024.06.02 |
---|---|
[SWEA/Python] 1928. Base64 Decoder (0) | 2024.05.19 |