π» DEV/Algorithms & Data Structure
[Algorithm] κΉμ΄μ°μ νμ(DFS) κ³Ό λλΉμ°μ νμ(BFS)
vodkassi
2021. 6. 30. 16:39
728x90
DFS μ BFS λ κ°κ° Depth-First Search μ Breadth-First Search λ‘, κΉμ΄μ°μ νμκ³Ό λλΉμ°μ νμμ λ»νλ€. λμ μ°¨μ΄μ κ³Ό μ½λ ꡬν λ°©λ²μ ꡬ체μ μΌλ‘ μμλ³΄κ³ μ νλ€.
BFS
- κ·Έλν μλ£κ΅¬μ‘°νμμ κ°μ₯ κ°κΉμ΄ λ ΈλλΆν° μ°μ μ μΌλ‘ νμνλ μκ³ λ¦¬μ¦μ΄λ€.
- νλ₯Ό μ΄μ©νμ¬ κ΅¬νν μ μλ€.
ꡬν λ¨κ³
- νμ νμ μμ λ Έλλ₯Ό μ½μ νλ€.
- νμ front λ₯Ό λ°©λ¬Έν λλ§λ€ λ°©λ¬Έ νμλ₯Ό νκ³ , popleft() λ₯Ό νλ€.
- νμ¬ λ°©λ¬Ένκ³ μλ λ Έλμ λ°©λ¬Ένμ§ μμ μΈμ λ Έλκ° μλ€λ©΄ κ·Έ λ Έλλ₯Ό νμ λ£λλ€
- νμ¬ λ°©λ¬Ένκ³ μλ λ Έλμ λ°©λ¬Ένμ§ μμ μΈμ λ Έλκ° μλ€λ©΄ νμ front μ κΊΌλΈλ€
- λ°λ³΅ μ€ννμ¬ νκ° μμ ν λΉ λ μ’ λ£νλ€
from collections import deque # Python μμ popleft() λ₯Ό νκΈ° μν λͺ¨λ
# λ
Έλμ λ²νΈμ λ°λΌ μ°κ²°λ μ 보λ₯Ό 2μ°¨μ λ°°μ΄ ννν μ μλ€.
# κ°λ Ή, 1 - 3 - 2 - 4 ννλ‘ μ°κ²°λ κ·ΈλνλΌλ©΄, [[], [3], [3, 4], [1, 2], [2]] λ‘ νν κ°λ₯νλ€.
graph = [[], [3], [3, 4], [1, 2], [2]]
# λ°©λ¬Έ μ²λ¦¬λ₯Ό μν 1μ°¨μ λ°°μ΄
# μ΄κΈ°κ°μ False λ‘ μ€μ ν΄μ£Όμ΄μΌ node λ₯Ό λ°©λ¬Ένλ©΄ True λ‘ μ ννμ¬ νμν μ μλ€.
visited = [False] * (len(graph))
# λ°©λ¬Έν΄μΌν λͺ©λ‘μ λ΄μ queueμ λ§λ€μ΄ while λ¬Έ μ€ν
queue = deque([1]) # 첫 λ²μ§Έλ‘ λ°©λ¬Έν λ
Έλ
while len(queue) > 0 :
cur = queue.popleft()
print(cur)
for item in graph[cur]:
if visited[item] == False:
queue.append(item)
visited[cur] = True
DFS
- κ·Έλν μλ£κ΅¬μ‘°νμμ κ°μ₯ κΉμ λΆλΆμ (μ¦, νΈλ¦¬ ꡬ쑰μμ κ°μ₯ νμμ μλ λ Έλλ₯Ό) λ¨Όμ λ°©λ¬Ένμ¬ νμνλ μκ³ λ¦¬μ¦μ΄λ€.
- μ€ν λλ μ¬κ·λ₯Ό μ΄μ©νμ¬ κ΅¬νν μ μλ€.
ꡬν λ¨κ³
- μ€νμ νμ μμ λ Έλλ₯Ό μ½μ νλ€
- μ€νμ top μ λ°©λ¬Έν λλ§λ€ pop μΌλ‘ μμ νκ³ , λ°©λ¬Έ νμλ₯Ό νλ€
- νμ¬ λ°©λ¬Ένκ³ μλ λ Έλμ λ°©λ¬Ένμ§ μμ μΈμ λ Έλκ° μλ€λ©΄ κ·Έ λ Έλλ₯Ό μ€νμ λ£λλ€
- νμ¬ λ°©λ¬Ένκ³ μλ λ Έλμ λ°©λ¬Ένμ§ μμ μΈμ λ Έλκ° μλ€λ©΄ μ€νμ top μ κΊΌλΈλ€
- λ°λ³΅ μ€ννμ¬ μ€νμ΄ μμ ν λΉ λ μ’ λ£νλ€
# λ
Έλμ λ²νΈμ λ°λΌ μ°κ²°λ μ 보λ₯Ό 2μ°¨μ λ°°μ΄ ννν μ μλ€.
# κ°λ Ή, 1 - 3 - 2 - 4 ννλ‘ μ°κ²°λ κ·ΈλνλΌλ©΄, [[], [3], [3, 4], [1, 2], [2]] λ‘ νν κ°λ₯νλ€.
graph = [[], [3], [3, 4], [1, 2], [2]]
# λ°©λ¬Έ μ²λ¦¬λ₯Ό μν 1μ°¨μ λ°°μ΄
# μ΄κΈ°κ°μ False λ‘ μ€μ ν΄μ£Όμ΄μΌ node λ₯Ό λ°©λ¬Ένλ©΄ True λ‘ μ ννμ¬ νμν μ μλ€.
visited = [False] * (len(graph))
# λ°©λ² 1
# λ°©λ¬Έν΄μΌν λͺ©λ‘μ λ΄μ stackμ λ§λ€μ΄ while λ¬Έ μ€ν
stack = [1] # 첫 λ²μ§Έλ‘ λ°©λ¬Έν λ
Έλ
while len(stack) > 0 :
cur = stack.pop()
print(cur)
visited[cur] = True
for item in graph[cur]:
if visited[item] == False:
stack.append(item)
λ°©λ² 2
# μ¬κ·μ μΌλ‘ μ€ννμ¬ λ°©λ¬Έ μμλ₯Ό μΆλ ₯νλ ν¨μ
dfs(graph, node, visited):
visited[node] = True
print(node)
for item in graph[node]:
if not visited[node]:
dfs(graph, item, visited)
for i in graph[node]: