CodingTest

[Python] DFS & BFS

λ„μΊλ¦¬πŸ± 2021. 5. 12. 19:27
λ°˜μ‘ν˜•
κ·Έλž˜ν”„λ‚˜ 트리 ꡬ쑰에 λŒ€ν•΄μ„œ μΆ©λΆ„ν•œ μ„€λͺ…이 μžˆλŠ” 글은 μ•„λ‹™λ‹ˆλ‹€.
python 으둜 DFS , BFS λ₯Ό κ΅¬ν˜„ν•˜λŠ” κ°„λ‹¨ν•œ μ½”λ“œμ™€ 그에 λŒ€ν•œ κ°œλ…μ„ μ •λ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

κ·Έλž˜ν”„λž€?

- μ‚¬μš©

    지도, λ„€μ΄κ²Œμ΄μ…˜μ— μ“°μž„

    SNS, λ©”μ‹ μ €(νŒ”λ‘œμš°/μ–ΈνŒ”λ‘œμš°)

    κΉƒ VCS 에 μ“°μž„

 

- 정점(vertext == node) κ³Ό κ°„μ„ (edge)둜 이루어져 있음.

 

- ꡬ뢄

    1. 무방ν–₯ κ·Έλž˜ν”„(==μ–‘λ°©ν–₯ κ·Έλž˜ν”„)

    2. λ°©ν–₯ κ·Έλž˜ν”„

    --------------------------------

    1. μˆœν™˜ κ·Έλž˜ν”„

    2. λΉ„μˆœν™˜ κ·Έλž˜ν”„

 

    λ°©ν–₯μ„± λΉ„μˆœν™˜ κ·Έλž˜ν”„(DAG) Directed Acyclic Graph

 

- μ—°κ²°μš”μ†Œ

μ—°κ²° μš”μ†Œ 2개

 

νŠΈλ¦¬λž€?

- μˆœν™˜μ„±X, 무방ν–₯

- 루트 λ…Έλ“œ, 리프 λ…Έλ“œ

- λ…Έλ“œ Aμ—μ„œ λ…Έλ“œ B둜 κ°€λŠ” κ²½λ‘œλŠ” λ°˜λ“œμ‹œ μ‘΄μž¬ν•˜λ©° μœ μΌν•˜λ‹€.

 

 

κ·Έλž˜ν”„λ₯Ό μ–΄λ–»κ²Œ μ½”λ“œλ‘œ?

1) 인접 ν–‰λ ¬λ‘œ 

  0 1 2 3
0 0 1 1 1
1 0 0 1 0
2 0 0 0 0
3 0 0 1 0

2) 인접 리슀트둜

0 | →1→2→3

1  | →2

2 |

3 | →2 

 

λ©”λͺ¨λ¦¬: 인접행렬보닀 μΈμ ‘λ¦¬μŠ€νŠΈκ°€ 더 우수

μ‹œκ°„: 인접 행렬이 μΈμ ‘λ¦¬μŠ€νŠΈλ³΄λ‹€ 더 우수 

 

 

κ·Έλž˜ν”„ 탐색 μ•Œκ³ λ¦¬μ¦˜

1) DFS : 깊이 μš°μ„  탐색 

    μŠ€νƒ λ˜λŠ” μž¬κ·€(μž¬κ·€λ„ μŠ€νƒμž„) μ‚¬μš©ν•΄μ„œ κ΅¬ν˜„

    BackTracking (ν•΄λ₯Ό μ°ΎκΈ° μœ„ν•΄μ„œ 체크 ν•˜λ‹€κ°€, μ œμ•½ 쑰건을 λ§Œμ‘±ν•  수 μ—†λ‹€κ³  νŒλ‹¨λ˜λ©΄ μ¦‰μ‹œ λ’€λ‘œ λŒμ•„κ°€λŠ”(이 후보ꡰ을     μ²΄ν¬ ν•˜μ§€ μ•Šμ„ 것을 ν‘œκΈ° ν›„/ 각 후보ꡰ듀은 DFS둜 ν™•μΈν•œλ‹€.)

 

  • 일반적인 DFS μ‹œκ°„ λ³΅μž‘λ„
    • λ…Έλ“œ 수: V
    • κ°„μ„  수: E
      • μœ„ μ½”λ“œμ—μ„œ while need_visit 은 V + E 번 만큼 μˆ˜ν–‰ν•¨
    • μ‹œκ°„ λ³΅μž‘λ„: O(V + E)
def dfs(graph, start_node):
    visited, need_visit = list(), list()
    need_visit.append(start_node)
    
    while need_visit:
        node = need_visit.pop()
        if node not in visited:
            visited.append(node)
            need_visit.extend(graph[node])
    
    return visited

 

2) BFS: λ„ˆλΉ„ μš°μ„  탐색

    큐 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„

  • 일반적인 BFS μ‹œκ°„ λ³΅μž‘λ„
    • λ…Έλ“œ 수: V
    • κ°„μ„  수: E
      • μœ„ μ½”λ“œμ—μ„œ while need_visit 은 V + E 번 만큼 μˆ˜ν–‰ν•¨
    • μ‹œκ°„ λ³΅μž‘λ„: O(V + E)
def bfs(graph, start_node):
    visited = list()
    need_visit = list()
    
    need_visit.append(start_node)
    
    while need_visit:
        node = need_visit.pop(0)
        if node not in visited:
            visited.append(node)
            need_visit.extend(graph[node])
    
    return visited
λ°˜μ‘ν˜•