CS/Algorithm

깊이 μš°μ„  탐색(Depth First Search, DFS)

deo2kim 2020. 9. 28. 20:29
λ°˜μ‘ν˜•

πŸ“” 깊이 μš°μ„  탐색(DFS) μ΄λž€

  • 깊이λ₯Ό μš°μ„ μœΌλ‘œ ν•˜μ—¬ 탐색을 μˆ˜ν–‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
  • νŠΉμ • λ…Έλ“œμ—μ„œ μ‹œμž‘ν•΄μ„œ λ‹€μŒ λΆ„κΈ°λ‘œ λ„˜μ–΄κ°€κΈ° 전에 ν•΄λ‹Ή λΆ„κΈ°λ₯Ό μ™„λ²½ν•˜κ²Œ νƒμƒ‰ν•˜λŠ” 방법!
  • ex) λ―Έλ‘œνƒμƒ‰ - λ§‰νž λ•Œ κΉŒμ§€ 계속 κ°€λ‹€κ°€ 막닀λ₯Έ 길이 λ‚˜μ˜€λ©΄ κ°€μž₯ 졜근의 갈림길둜 λŒμ•„κ°€ λ‹€μ‹œ 길을 μ°ΎλŠ” 것!
  • 경둜λ₯Ό μ°Ύκ³  싢을 λ–„
  • μŠ€νƒμ™€ κ·Έλž˜ν”„λ‘œ ν•΄κ²°ν•œλ‹€. ( μž¬κ·€ν•¨μˆ˜λ₯Ό 써도 됨 )
    μŠ€νƒμœΌλ‘œ μ‚¬μš©μ‹œ 이웃 쀑 κ°€μž₯ 뒀에 μžˆλŠ” 것뢀터,
    μž¬κ·€ μ‚¬μš©μ‹œ 이웃 쀑 κ°€μž₯ μ•žμ— μžˆλŠ” 것뢀터 νƒμƒ‰ν•œλ‹€.

πŸ“” 깊이 μš°μ„  탐색(DFS) κ΅¬ν˜„

def dfs(c):
    print(c, end=' ')
    for neighbor in adj[c]:  # c의 이웃 쀑
        if visited[neighbor] == 0:  # λ°©λ¬Έ 아직 μ•ˆν•œ 친ꡬ이면
            visited[neighbor] = 1
            dfs(neighbor)


# μΈμ ‘λ¦¬μŠ€νŠΈ
# λ…Έλ“œ: 1,2,3,4,5,6,7
n = 10
adj = {x: [] for x in range(1, n + 1)}
edges = [
    [1, 2],
    [1, 5],
    [1, 9],
    [2, 3],
    [3, 4],
    [5, 6],
    [5, 8],
    [6, 7],
    [9, 10]
]

# 무방ν–₯ κ·Έλž˜ν”„μ΄λ―€λ‘œ λ°˜λŒ€μͺ½λ„ 성립
for edge in edges:
    s, e = edge
    adj[s].append(e)
    adj[e].append(s)

print(adj)

# 1λΆ€ν„° 탐색
k = 1
visited = [0] * (n + 1)
visited[k] = 1
print('λ°©λ¬Έ μˆœμ„œ')
dfs(k)

 

λ°˜μ‘ν˜•