π DFS & BFS
- νμ μκ³ λ¦¬μ¦
- DFSμ BFSλ κ·Έλν νμ μκ³ λ¦¬μ¦μ μνλ©°, κ·Έλνμ λͺ¨λ κΌμ§μ μ λ°©λ¬Ένλ μκ³ λ¦¬μ¦μ μλ―Έν¨
- νΈλ¦Ό νμμ κ·Έλν νμμ νΉμ μΌμ’
μ΄λ©°, λ°©λ¬Έν λ
Έλλ λ€μ λ°©λ¬Ένμ§ μμ
π Graph
- κ·Έλνλ λ
Έλμ κ°μ μΌλ‘ μ΄λ£¨μ΄μ§ μλ£κ΅¬μ‘°μ μΌμ’
- κ·Έλν ꡬν λ°©μ
- μΈμ νλ ¬ : 2μ°¨μ λ°°μ΄μ νμ©ν λ°©μ
- μ₯μ : λ λ
Έλμ κ°μ μ‘΄μ¬ μ¬λΆλ₯Ό λ°λ‘ νμ
ν μ μμ
- λ¨μ : λͺ¨λ κ΄κ³λ₯Ό κΈ°λ‘νλ―λ‘ λ
Έλμ μκ° λ§μ μλ‘ λ©λͺ¨λ¦¬ λλΉκ° μκΉ
- μΈμ 리μ€νΈ : μ°κ²°λ¦¬μ€νΈλ₯Ό νμ©ν λ°©μ
- μ₯μ : μ°κ²°λ κ²λ§ κΈ°λ‘νμ¬ νΉμ λ
Έλμ μΈμ λ
Έλλ₯Ό λ°λ‘ νμ
ν μ μμ
- λ¨μ : λ λ
Έλκ° μ°κ²°λμ΄ μλμ§ νμΈνλλ° μΈμ νλ ¬λ³΄λ€ μ€λκ±Έλ¦Ό
- λ°λΌμ μΈμ νλ ¬μ κ·Έλνμ κ°μ μ΄ λ§μ΄ μ‘΄μ¬νλ λ°μ§ κ·ΈλνμΌ λ, μΈμ 리μ€νΈλ κ°μ μ΄ μ μ ν¬μ κ·ΈλνμΌ κ²½μ°μ μ¬μ©ν¨
π DFS
- κ·Έλνμ κΉμ λΆλΆμ μ°μ μ μΌλ‘ νμνλ μκ³ λ¦¬μ¦
- μκ°λ³΅μ‘λ : O(N)
- μ€ν ꡬν λ°©λ²
1. λΉ μ€νμ μμν λ
Έλλ₯Ό λ£μ
2. μ€νμμ λ
Έλλ₯Ό popνκ³ μΆλ ₯, κΊΌλΈ λ
Έλμ μμ λ
Έλλ₯Ό λ€ λ£μ (μ΄λ ν λ² μ€νμ λ΄μ λ
Έλλ λ€μ λ£μ§ μμ)
3. 2λ² κ³Όμ μ λ μ΄μ μνν μ μμ λκΉμ§ λ°λ³΅
- μ€νμ μ¬μ©νλ―λ‘ λ§μ§λ§μΌλ‘ λ£μ λ
ΈλλΆν° νμλ¨
- μ¬κ· ꡬν λ°©λ²
1. λ
Έλμ μμμ μμ...μ κ³μ νΈμΆν¨
2. λ μ΄μ μμμ΄ μλ κ²½μ° ν λ¨κ³ μ¬λΌμμ κ·Έ μ§μ μ λ€λ₯Έ κ²½λ‘λΆν° νμμ λ€μ μμν¨
- ꡬν μ μ€νμ μ¬μ©νμ§ μμλ λλ―λ‘ μ½λκ° κΉλν¨
graph = [
[],
[2, 3],
[4, 5],
[6],
[2, 5],
[2, 4],
[3, 7],
[6]
]
visited = [False] * 8
def recursive_dfs(v):
visited[v] = True
for i in graph[v]:
if not visited[i]:
recursive_dfs(i)
recursive_dfs(1)
def iterative_dfs(v):
visited=[]
stack = [v]
while stack:
v = stack.pop()
if v not in visited:
visited.append(v)
for w in graph[v]:
stack.append(w)
return visited
iterative_dfs(1)
π BFS
- κ·Έλνμ λλΉλΆν° νμνμ¬ μμ λ
Έλλ‘λΆν° κ°κΉμ΄ μ§μ μ λ¨Όμ λ°©λ¬Ένκ³ λ¨Ό μ§μ μ λμ€μ λ°©λ¬Έν¨
- 무νν κΈΈμ΄λ₯Ό κ°μ§λ κ²½λ‘κ° μ‘΄μ¬ν λ νμ λͺ©νκ° λ€λ₯Έ κ²½λ‘μ μλ κ²½μ°, λͺ¨λ κ²½λ‘λ₯Ό λμμ μ§ννλ―λ‘ νμμ΄ κ°λ₯ν¨
- νλ‘ κ΅¬νμ΄ κ°λ₯νλ©° μ¬κ·λ‘ ꡬνμ λΆκ°λ₯ν¨
- μκ°λ³΅μ‘λ : O(N) - BFSλ³΄λ€ μ‘°κΈ λ λΉ λ₯΄κ² λμν¨
- ν ꡬν λ°©λ²
1. λΉ νλ₯Ό λ§λ€κ³ μμ λ
Έλλ₯Ό λ£μ
2. νμμ popνκ³ μΆλ ₯ν¨, κΊΌλΈ λ
Έλμ μμλ€μ νμ μΆκ°ν¨ (μ΄λ, ν λ² νμ λ΄μ λ
Έλλ λ€μ λ£μ§ μμ)
3. 2λ² κ³Όμ μ λ μ΄μ μνν μ μμλκΉμ§ λ°λ³΅
graph = [
[],
[2, 3],
[4, 5],
[6],
[2, 5],
[2, 4],
[3, 7],
[6]
]
visited = [False] * 8
from collections import deque
def bfs(v):
q = deque()
q.append(v)
while q:
x = q.popleft()
for i in graph[x]:
if not visited[i]:
q.append(i)
visited[i] = True
bfs(1)
π DFS / BFSμ μμ©
-
DFSμ μ₯μ
- ν κ²½λ‘μμ λ
Έλλ§ κΈ°μ΅νλ―λ‘ μ μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©ν¨
- λͺ©ν λ
Έλκ° κΉμ λ¨κ³μ μλ κ²½μ° λΉ λ₯΄κ² νμ κ°λ₯
-
DFSμ λ¨μ
- 무νν κΈΈμ΄λ₯Ό κ°μ§λ κ²½λ‘κ° μ‘΄μ¬νλ κ²½μ° μμν μ’
λ£νμ§ λͺ»ν¨
- λͺ©νμ μ΄λ₯΄λ κ²½λ‘κ° λ€μμΈ κ²½μ°, ν΄μ λμ°©νλ©΄ νμμ μ’
λ£νλ―λ‘ μ»μ ν΄κ° μ΅λ¨ κ²½λ‘λΌλ 보μ₯μ΄ μμ
-
BFSμ μ₯μ
- λͺ¨λ κ²½λ‘λ₯Ό νμνλ―λ‘ μ¬λ¬ ν΄κ° μ‘΄μ¬ν΄λ μ΅λ¨ κ²½λ‘λ₯Ό 보μ₯ν¨
- 무νν κΈΈμ΄μ κ²½λ‘κ° μ‘΄μ¬ν΄λ ν΄λ₯Ό μ°Ύμ μ μμ
- λ
Έλμ μκ° μ κ³ , κΉμ΄κ° μμ ν΄κ° μ‘΄μ¬ν λ μ 리ν¨
-
BFSμ λ¨μ
- λ
Έλμ μκ° λ§μμλ‘ λ§μ λ©λͺ¨λ¦¬λ₯Ό νμλ‘ ν¨ (κ·Έλνμ λΉλ‘νλ 곡κ°λ³΅μ‘λλ₯Ό κ°μ§)
π κ΄λ ¨ λ¬Έμ
β νκ²λλ²
β λ€νΈμν¬
β κ²μ 맡 μ΅λ¨κ±°λ¦¬
β λ¨μ΄λ³ν
β μμ΄ν
μ€κΈ°
β μ¬νκ²½λ‘