๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)

DFS(๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰)

1. DFS(Depth First Search)๋ž€?

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ทธ๋ž˜ํ”„๋Š” ๋…ธ๋“œ(Node)์™€ ๊ฐ„์„ (Edge)๋กœ ํ‘œํ˜„๋˜๋ฉฐ ๋…ธ๋“œ๋Š” ์ •์ (Vertex)๋ผ๊ณ ๋„ ํ•œ๋‹ค.

๊ทธ๋ž˜ํ”„๋Š” ์ธ์ ‘๋ฆฌ์ŠคํŠธ(๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„ ํ‘œํ˜„)์™€ ์ธ์ ‘ํ–‰๋ ฌ(2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„)๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

DFS(๊นŠ์ด์šฐ์„ ํƒ์ƒ‰)๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋™์ž‘๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1.  ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
2.  ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.  
    ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
3.  2๋ฒˆ์œ„ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

2. ์˜ˆ์‹œ ์ฝ”๋“œ

def dfs(graph, v, visited):
    visited[v] = True                   # ํ˜„์žฌ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    print(v, end=' ')
    for i in graph[v]:                  # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ (graph[v]์— v์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ์Œ)
        if not visited[i]:              # ๋งŒ์•ฝ i๊ฐ€ ๋ฐฉ๋ฌธ์ด True๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด (๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด)
            dfs(graph, i, visited)      # dfs๋กœ graph[v]์˜ i ๋…ธ๋“œ dfs์ฒ˜๋ฆฌ (๊ณ„์† ๊นŠ์–ด์ง)

n = int(input())                          # ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
graph = [[] * (n + 1)]

for _ in range(1, n+1):
  array = list(map(int, input().split()))
  graph.append(array)

visited = [False] * (n + 1)             #[0]์€ ์‚ฌ์šฉ x

dfs(graph, 1, visited)                  # 1๋ถ€ํ„ฐ ๊นŠ์ด์šฐ์„ ํƒ์ƒ‰ ์‹œ์ž‘

3. ์˜ˆ์‹œ ์ž…์ถœ๋ ฅ

  ๊ฐ™์€ ํ–‰์€ ํ•ด๋‹นํ–‰์˜ index์™€ ์—ฐ๊ฒฐ๋œ๊ฒƒ์ด๋‹ค.(๋…ธ๋“œ1์€ ๋…ธ๋“œ2,๋…ธ๋“œ3,๋…ธ๋“œ8๊ณผ ์—ฐ๊ฒฐ)

  ์ž…๋ ฅ : 
  (๋…ธ๋“œ1)  2 3 8
  (๋…ธ๋“œ2)  1 7
  (๋…ธ๋“œ3)  1 4 5
  (๋…ธ๋“œ4)  3 5
  (๋…ธ๋“œ5)  3 4
  (๋…ธ๋“œ6)  7
  (๋…ธ๋“œ7)  2 6 8
  (๋…ธ๋“œ8)  1 7

  ์ถœ๋ ฅ :
  ๋…ธ๋“œ 1์—์„œ dfs๋ฅผ ๊ตฌํ•˜๋ฉด
  output = 1 2 7 6 8 3 4 5