[ํ์ด์ฌ/python] DFS์ BFS
๊น์ด ์ฐ์ ํ์ DFS์ ๋๋น ์ฐ์ ํ์ BFS๋ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ํ๋ ์ ์ node์ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ edge๋ก ์ด๋ฃจ์ด์ ธ ์๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
๊น์ด ์ฐ์ ํ์ DFS
DFS๋ Depth First Search์ ์ฝ์๋ก, ๋ฃจํธ ๋ ธ๋์์ ์์ํ์ฌ ์๋ ๋ฐฉํฅ์ผ๋ก ํ์ํ๋ค.
์ต๋ํ ๊น์ด ๋ด๋ ค๊ฐ ๋ค ๋์ด์ ๊ฐ ๊ณณ์ด ์์ ๊ฒฝ์ฐ ์์ผ๋ก ์ด๋ํ์ฌ ํ์ํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์
๋ฃจํธ๋ ธ๋์์ ๋ค์ ๋ถ๊ธฐ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ค.
๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๋ฉฐ, BFS๋ณด๋ค ์ข ๋ ๊ฐ๋จํ์ง๋ง ๊ฒ์์๋๋ ๋๋ฆฌ๋ค.
์๊ธฐ ์์ ์ ํธ์ถํ๋ ์ฌ๊ท์ ์๊ณ ๋ฆฌ์ฆ์ ํํ๋ก ๊ตฌํํ๋ฉฐ ์คํ์ ์ด์ฉํ๋ค.
๋๋น ์ฐ์ ํ์ BFS
BFS๋ Breadth First Search์ ์ฝ์๋ก, ๋ฃจํธ ๋ ธ๋์์ ์์ํ์ฌ ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ผ๋ก ํ์ํ๋ค.
์ต๋ํ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ ๋ค ๋์ด์ ๊ฐ ๊ณณ์ด ์์ ๊ฒฝ์ฐ ๋ฐ์ผ๋ก ์ด๋ํ์ฌ ํ์ํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์
์์ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ๊น์ด ์ ์ ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ์ ์ ์ ๋์ค์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค.
์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๊ฒฝ์ฐ ์ ์ฉํ๋ฉฐ, DFS๋ณด๋ค ๊ฒ์์๋๊ฐ ๋น ๋ฅด์ง๋ง ์ข ๋ ๋ณต์กํ๋ค.
์ฌ๊ท์ ์ผ๋ก ๋์ํ์ง ์์ผ๋ฉฐ ํ๋ฅผ ์ด์ฉํ์ฌ ์ ์ ์ ์ถ(FIFO)์ ๋ฐฉ์์ผ๋ก ํ์ํ๋ค.
ํ์ด์ฌ์ผ๋ก ๊ตฌํํ๊ธฐ
๊ตฌํํ ๋ ์ด๋ค ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์๋์ง ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ฐ๋์ ๊ฒ์ฌํด์ผํ๋ค.
๊ฒ์ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ฌดํ๋ฃจํ์ ๋น ์ง ์ํ์ด ์๋ค.
DFS์ BFS์ ์ฐจ์ด๋ ์ธ์ ํ ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋จผ์ ๋ณด๋๋, ํ์ฌ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋ชจ๋ ๋ณด๊ณ ๋์ด๊ฐ๋๋์ ์ฐจ์ด๋ค.
์ธ์ ํ ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋จผ์ ๋ณธ๋ค๋ฉด, ๊ฐ์ฅ ์ต๊ทผ์ ์์ธ ์์๋๋ก ๋ด์ผํ๋ฏ๋ก stack์ ํ์ฉํ๊ณ
ํ์ฌ ์ธ์ ํ ๋ ธ๋๋ฅผ ๋ชจ๋ ๋ณด๊ณ ๋์ด๊ฐ๋ค๋ฉด, ๋จผ์ ๋ค์ด์จ ๊ฒ์ ๋จผ์ ๋ด์ผํ๋ฏ๋ก queue๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
graph_list = {1: [3, 4],
2: [3, 4, 5],
3: [1, 5],
4: [1],
5: [2, 6],
6: [3, 5]}
root_node = 1
๋์ ๋๋ฆฌ ํํ์ graph_list์๋ key๊ฐ ๊ฐ ์ ์๋ ๊ณณ, ์ฆ ์ธ์ ํ ๋ ธ๋๋ค์ value๋ก ์ ์ฅํด๋์๋ค.
DFS ๊ตฌํํ๊ธฐ
def DFS(graph, root):
visited = []
stack = [root]
while stack:
n = stack.pop()
if n not in visited:
visited.append(n)
stack.extend(sorted(graph[n], reverse=True))
return visited
print(DFS(graph_list, root_node))
๋ฐฉ๋ฌธํ ๋ ธ๋ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ visted์ ์ธ์ ํ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์๋ ๋ ธ๋๋ฅผ ์ ์ฅํ stack๋ฅผ ์์ฑํ๋ค.
๋ฐฉ๋ฌธ ์์ ์ธ stack์ ๊ฐ์ด ์์ ๋์ ๋ฐ๋ณตํ๋ค.
๊ฐ์ฅ ์ฒซ๋ฒ์งธ๋ก ๋ฐฉ๋ฌธํ ๋ ธ๋ stack.pop()์ n์ ์ ์ฅํ๋ค.
n์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด visited์ ์ถ๊ฐํ์ฌ ๋ฐฉ๋ฌธํ์์ ํ์ํ๊ณ
stack์ n๊ณผ ์ธ์ ํ ๋ ธ๋ graph[n]์ ์ถ๊ฐํ๋๋ฐ,
๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๊ฐํด์ผ pop()ํ์ ๋ ์ฒ์ ๋ ธ๋๋ถํฐ ๋ฐฉ๋ฌธํ ์ ์๋ค.
BFS ๊ตฌํํ๊ธฐ
from collections import deque
def BFS(graph, root):
visited = []
queue = deque([root])
while queue:
n = queue.popleft()
if n not in visited:
visited.append(n)
queue.extend(graph[n])
return visited
print(BFS(graph_list, root_node))
๋ฐฉ๋ฌธํ ๋ ธ๋ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ visted์ ์ธ์ ํ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์๋ ๋ ธ๋๋ฅผ ์ ์ฅํ queue๋ฅผ ์์ฑํ๋ค.
์ด๋ popleft()๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด queue๋ฅผ collections์ deque๋ก ์์ฑํ๋ค.
๋ฐฉ๋ฌธ ์์ ์ธ queue์ ๊ฐ์ด ์์ ๋์ ๋ฐ๋ณตํ๋ค.
๊ฐ์ฅ ์ฒซ๋ฒ์งธ๋ก ๋ฐฉ๋ฌธํ ๋ ธ๋ queue.popleft()๋ฅผ n์ ์ ์ฅํ๋ค.
n์ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด visited์ ์ถ๊ฐํ์ฌ ๋ฐฉ๋ฌธํ์์ ํ์ํ๊ณ
queue์ n๊ณผ ์ธ์ ํ ๋ ธ๋ graph[n]์ ์ถ๊ฐํ๋ค.
'๐์๊ณ ๋ฆฌ์ฆ > ๐ ๊ฐ๋ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ์ด์ฌ/python] DFS, BFS ๊ตฌํ (์ฌ๊ท) (0) | 2021.07.03 |
---|---|
[ํ์ด์ฌ/python] ์งํฉ (0) | 2021.04.05 |
[์๊ณ ๋ฆฌ์ฆ] ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ (Brute Force) (0) | 2021.04.02 |
[ํ์ด์ฌ/python] ์์ด๊ณผ ์กฐํฉ : itertools ์ด์ฉํ๊ธฐ (permutations, combinations) (0) | 2021.04.01 |
[ํ์ด์ฌ/python] ๋์ ๊ณํ๋ฒ (Dynamic Programming) (0) | 2021.03.25 |