ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] DFS
    🎸 2024. 6. 7. 00:41

    DFS(Depth-First Search)

    > 깊이 μš°μ„  νƒμƒ‰μœΌλ‘œ, κ·Έλž˜ν”„μ—μ„œ 수직 μš°μ„ μœΌλ‘œ νƒμƒ‰ν•œλ‹€.

    • κ·Έλž˜ν”„: λ…Έλ“œ(Node)와 κ°„μ„ (Edge)으둜 ν‘œν˜„
    • κ·Έλž˜ν”„ 탐색: ν•˜λ‚˜μ˜ λ…Έλ“œλ₯Ό μ‹œμž‘μœΌλ‘œ λ‹€μˆ˜μ˜ λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜λŠ” 것. 두 λ…Έλ“œκ°€ κ°„μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆμ„ λ•Œ, 두 λ…Έλ“œλŠ” μΈμ ‘ν•˜λ‹€(Adjacent)라고 ν•œλ‹€.
    • 인접 ν–‰λ ¬(Adjacency Matrix): 2차원 λ°°μ—΄λ‘œ κ·Έλž˜ν”„μ˜ μ—°κ²° 관계λ₯Ό ν‘œν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ, μ—°κ²°λ˜μ§€ μ•Šμ€ λ…Έλ“œλΌλ¦¬λŠ” λ¬΄ν•œμ˜ λΉ„μš©μ„ κ°€μ •ν•˜μ—¬ 값을 μ΄ˆκΈ°ν™”ν•œλ‹€.
      * νŒŒμ΄μ¬μ€ 배열을 리슀트 μžλ£Œν˜•μœΌλ‘œ ν‘œν˜„ κ°€λŠ₯ν•˜λ―€λ‘œ, 리슀트둜 κ΅¬ν˜„ν•˜λŠ” 방식을 μ„ νƒν•œλ‹€.
    • 인접 리슀트(Adjacency List): 리슀트둜 κ·Έλž˜ν”„μ˜ μ—°κ²° 관계λ₯Ό ν‘œν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ, 각 λ…Έλ“œλ§ˆλ‹€ μ—°κ²°λœ λ…Έλ“œμ— λŒ€ν•œ 정보λ₯Ό μ—°κ²°ν•˜μ—¬ μ €μž₯

    BFS와 DFS의 탐색 μˆœμ„œ 차이

     

    > DFS의 μŠ€νƒ 자료ꡬ쑰λ₯Ό ν™œμš©ν•œ λ™μž‘ κ³Όμ •

        * μŠ€νƒμ— λ…Έλ“œλ₯Ό μŒ“λŠ” 과정을 1κ°œμ”©(λ…Έλ“œ λ²ˆν˜Έκ°€ μž‘μ€ 순으둜) μ§„ν–‰ν•˜λŠ” 경우

    1. 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό μŠ€νƒμ— μ‚½μž…ν•˜κ³  λ°©λ¬Έ 처리λ₯Ό ν•œλ‹€.
    2. μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμ— λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œκ°€ 있으면 κ·Έ 인접 λ…Έλ“œλ₯Ό μŠ€νƒμ— λ„£κ³  λ°©λ¬Έ 처리λ₯Ό ν•œλ‹€.
      2-1. λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œκ°€ μ—†μœΌλ©΄ μŠ€νƒμ—μ„œ μ΅œμƒλ‹¨ λ…Έλ“œλ₯Ό κΊΌλ‚Έλ‹€.
    3. 2번 과정을 더 이상 μˆ˜ν–‰ν•  수 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

    > μŠ€νƒμœΌλ‘œ κ΅¬ν˜„ μ‹œ μ—¬λŸ¬ 개의 λ…Έλ“œλ₯Ό ν•œ λ²ˆμ— μŠ€νƒμ— μŒ“λŠ” 방법

    1. 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό μŠ€νƒμ— μ‚½μž…ν•˜κ³ , μ¦‰μ‹œ κΊΌλ‚΄ ν•΄λ‹Ή λ…Έλ“œλ₯Ό 탐색 λ…Έλ“œμ— μ €μž₯
    2. 탐색 λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ°©λ¬Έ μ²˜λ¦¬ν•˜κ³ , λͺ¨λ“  인접 λ…Έλ“œ 쀑 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œλ₯Ό λͺ¨λ‘ μŠ€νƒμ— μΆ”κ°€
      * μŠ€νƒμ˜ ν›„μž…μ„ μΆœ(LIFO, Last In First Out) νŠΉμ„±μ— μ˜ν•΄ DFS 탐색은 μ—­μˆœμœΌλ‘œ 진행됨.
    3. 2번 과정을 더 이상 μˆ˜ν–‰ν•  수 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

    > μž¬κ·€λ₯Ό μ΄μš©ν•˜μ—¬ κ°„κ²°ν•˜κ²Œ μ½”λ“œ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

    • μž¬κ·€: ν•˜λ‚˜μ˜ ν•¨μˆ˜μ—μ„œ 자기 μžμ‹ μ„ λ‹€μ‹œ ν˜ΈμΆœν•˜μ—¬ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
    • μˆ˜ν•™μ  귀납법: '1번 도미노가 μ“°λŸ¬μ§„λ‹€', 'k번 도미노가 μ“°λŸ¬μ§€λ©΄ k+1번 도미노도 μ“°λŸ¬μ§„λ‹€'κ°€ 참이면, 'λͺ¨λ“  도미노가 μ“°λŸ¬μ§„λ‹€.'
      * μž¬κ·€ ν•¨μˆ˜κ°€ 자기 μžμ‹ μ„ μ—¬λŸ¬ 번 ν˜ΈμΆœν•˜κ²Œ 되면, μž¬ν˜ΈμΆœν•˜λŠ” κ³Όμ •μ—μ„œ 쀑볡 연산이 λ°œμƒν•˜μ—¬ μ‹œκ°„λ³΅μž‘λ„κ°€ μ»€μ§€λŠ” λ“± λΉ„νš¨μœ¨μ΄ λ°œμƒν•  수 μžˆλ‹€.
    # λ°©λ¬Έ 처리λ₯Ό μœ„ν•œ 리슀트 생성
    visited = [False] * n
    
    # μž¬κ·€ ν•¨μˆ˜ 생성
    def dfs(node):
        visited[node] = True # 방문 처리
        for i in graph[node]: # λ…Έλ“œν–‰ λ‚΄ μ›μ†Œ(λ…Έλ“œ)λ₯Ό λŒλ©΄μ„œ λ°©λ¬Έ 확인
            if not visited[i]:
                dfs(i) # λ―Έ λ°©λ¬Έ λ…Έλ“œ μ‹œ μž¬κ·€ ν•¨μˆ˜ μ‹œν–‰

     

    Reference
    • [λ°”ν‚Ήλ…μ˜ μ‹€μ „ μ•Œκ³ λ¦¬μ¦˜] 0x0Bκ°• - μž¬κ·€
    • 이것이 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈλ‹€ with 파이썬