CodeGym /ํ–‰๋™ /Python SELF KO /๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ (DFS) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ (DFS) ์•Œ๊ณ ๋ฆฌ์ฆ˜

Python SELF KO
๋ ˆ๋ฒจ 56 , ๋ ˆ์Šจ 1
์‚ฌ์šฉ ๊ฐ€๋Šฅ

7.1 DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ž‘๋™ ์›๋ฆฌ

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ (Depth-First Search, DFS)๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์ˆœํšŒํ•˜๊ฑฐ๋‚˜ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์•ผ. ์‹œ์ž‘ ์ •์ ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ด์›ƒ์ด ์—†์„ ๋•Œ๊นŒ์ง€ ๊ทธ๋ž˜ํ”„๋ฅผ ๋” ๊นŠ์ด ํƒ์ƒ‰ํ•œ ๋‹ค์Œ, ๋Œ์•„๊ฐ€์„œ ๋‹ค๋ฅธ ์ •์ ์œผ๋กœ ๊ณ„์† ์ง„ํ–‰ํ•ด.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹จ๊ณ„:

  1. ์„ ํƒํ•œ ์‹œ์ž‘ ์ •์ ์—์„œ ์‹œ์ž‘ํ•˜๊ณ , ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•ด.
  2. ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ด์›ƒ ์ •์ ์„ ํƒ์ƒ‰ํ•ด.
  3. ์ด ์ด์›ƒ ์ •์ ์— ๋Œ€ํ•ด ๋‹จ๊ณ„ 1๊ณผ 2๋ฅผ ๋ฐ˜๋ณตํ•ด.
  4. ํ˜„์žฌ ์ •์ ์˜ ์ด์›ƒ์ด ๋ชจ๋‘ ๋ฐฉ๋ฌธ๋˜๋ฉด ์ด์ „ ์ •์ ์œผ๋กœ ๋Œ์•„๊ฐ€ (backtrack) ๊ณผ์ •์„ ๊ณ„์†ํ•ด.
  5. ์‹œ์ž‘ ์ •์ ์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด.

์‹œ๊ฐํ™”:

DFS์˜ ์‹œ๊ฐ„ ๋ฐ ๊ณต๊ฐ„ ๋ณต์žก๋„:

์‹œ๊ฐ„ ๋ณต์žก๋„:

O(V + E), ์—ฌ๊ธฐ์„œ V๋Š” ์ •์ ์˜ ์ˆ˜, E๋Š” ๊ฐ„์„ ์˜ ์ˆ˜์•ผ.

๊ทธ๋ž˜ํ”„์˜ ๊ฐ ๋…ธ๋“œ์™€ ๊ฐ ๊ฐ„์„ ์€ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธ๋ผ.

๊ณต๊ฐ„ ๋ณต์žก๋„:

O(V), ํ˜ธ์ถœ ์Šคํƒ์ด๋‚˜ ๋ช…์‹œ์  ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ ์„ ์ €์žฅํ•˜๊ณ , ์ƒํƒœ (๋ฐฉ๋ฌธํ•œ ์ •์ )๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์•ผ.

7.2 ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•œ DFS ๊ตฌํ˜„

๋จผ์ € ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•ด์„œ DFS๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž โ€” ์ฝ”๋“œ๊ฐ€ ์•„๋ฆ„๋‹ต๊ณ  ๊ฐ„๊ฒฐํ• ๊ฑฐ์•ผ.

์žฌ๊ท€์  DFS ๊ตฌํ˜„:


def dfs_recursive(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    print(start)  # ๋…ธ๋“œ ์ฒ˜๋ฆฌ
    
    for neighbor in graph[start]:
        if neighbor not in visited:
            dfs_recursive(graph, neighbor, visited)
    
# ์‚ฌ์šฉ ์˜ˆ์‹œ:
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B'],
    'F': ['C']
}
dfs_recursive(graph, 'A')

7.3 ์Šคํƒ์„ ์‚ฌ์šฉํ•œ DFS ๊ตฌํ˜„

์žฌ๊ท€ ์—†์ด ๊ตฌํ˜„ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋” ๊ธธ์–ด์ ธ, ์™œ๋ƒํ•˜๋ฉด ๋ฐฉ๋ฌธํ•œ ์ •์ ์˜ ๋ชฉ๋ก์„ ์ถ”๊ฐ€๋กœ ์ €์žฅํ•ด์•ผ ํ•˜๊ฑฐ๋“ .

์Šคํƒ์„ ์‚ฌ์šฉํ•œ ๋ฐ˜๋ณต์  DFS ๊ตฌํ˜„:


def dfs_iterative(graph, start):
    visited = set()
    stack = [start]
        
    while stack:
        vertex = stack.pop()
        if vertex not in visited:
            visited.add(vertex)
            print(vertex)  # ๋…ธ๋“œ ์ฒ˜๋ฆฌ
        
            for neighbor in reversed(graph[vertex]):  # ์˜ฌ๋ฐ”๋ฅธ ์ˆœํšŒ ์ˆœ์„œ๋ฅผ ์œ„ํ•ด ๋ฐ˜๋Œ€๋กœ ์ˆœํšŒ
                if neighbor not in visited:
                    stack.append(neighbor)
        
# ์‚ฌ์šฉ ์˜ˆ์‹œ:
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B'],
    'F': ['C']
}
dfs_iterative(graph, 'A')

7.4 DFS๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜ ์˜ˆ

DFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์ „์ ์ธ ๋ฌธ์ œ์˜ ์˜ˆ:

1. ๋ฏธ๋กœ์—์„œ์˜ ๊ฒฝ๋กœ ์ฐพ๊ธฐ:

์‹œ์ž‘ ์ง€์ ์—์„œ ๋ ์ง€์ ๊นŒ์ง€ ๋ฏธ๋กœ์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ.

์ ์šฉ ๋ถ„์•ผ:

๋น„๋””์˜ค ๊ฒŒ์ž„๊ณผ ๋กœ๋ด‡๊ณตํ•™์—์„œ ๋ฏธ๋กœ์™€ ๋ณต์žกํ•œ ๊ณต๊ฐ„์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ.

2. ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ์„ฑ ๊ฒ€์‚ฌ:

๊ทธ๋ž˜ํ”„๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ (๋ชจ๋“  ๋‘ ์ •์  ์‚ฌ์ด์— ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š”์ง€) ํ™•์ธํ•˜๋Š” ๊ฒƒ.

์ ์šฉ ๋ถ„์•ผ:

๋„คํŠธ์›Œํฌ ๋ถ„์„์—์„œ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ.

3. ์œ„์ƒ ์ •๋ ฌ:

๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„ (DAG)์˜ ์ •์ ์„ ์ •๋ ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ. ๋ชจ๋“  ๊ฐ„์„  (u, v)์— ๋Œ€ํ•ด ์ •์  u๊ฐ€ ์ •์  v์— ์•ž์„œ๋„๋ก.

์ ์šฉ ๋ถ„์•ผ:

์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์˜์กด์„ฑ๊ณผ ์ž‘์—…์„ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ.

4. ๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด ๋ฐœ๊ฒฌ:

๊ทธ๋ž˜ํ”„์— ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ.

์ ์šฉ ๋ถ„์•ผ:

์˜์กด์„ฑ ๋ถ„์„์—์„œ ์ˆœํ™˜ ์˜์กด์„ฑ์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ.

5. ๋ฏธ๋กœ ์ƒ์„ฑ:

๋žœ๋ค ๋ฏธ๋กœ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ DFS ์‚ฌ์šฉ.

์ ์šฉ ๋ถ„์•ผ:

๊ฒŒ์ž„ ๋ฐ ์—”ํ„ฐํ…Œ์ธ๋จผํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฏธ๋กœ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ.

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION