Super Kawaii Cute Cat Kaoani
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/Python

[Python] DFS ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰

728x90

๐Ÿ”Ž DFS (Depth-First Search)

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰, ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜


๊ทธ๋ž˜ํ”„์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

๋…ธ๋“œ(node)์™€ ๊ฐ„์„ (edge)๋กœ ํ‘œํ˜„

 

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋‹ค์ˆ˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ

๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด โžก ๋‘ ๋…ธ๋“œ๋Š” ์ธ์ ‘ํ•˜๋‹ค

 

๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ์‹

์ธ์ ‘ ํ–‰๋ ฌ (Adjacency Matrix) : 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ ๊ด€๊ณ„ ํ‘œํ˜„
์ธ์ ‘ ๋ฆฌ์ŠคํŠธ (Adjacency List) : ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„ ์—ฐ๊ฒฐ ๊ด€๊ณ„ ํ‘œํ˜„

 

์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹

2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„

์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ๋…ธ๋“œ๋ผ๋ฆฌ๋Š” ๋ฌดํ•œ์˜ ๋น„์šฉ (999999999 ๋“ฑ์˜ ํฐ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”)

INF = 99999999

graph = [ [0,   7,   5],
          [7,   0, INF],
          [5, INF,   0] ]

print(graph)		# [[0, 7, 5], [7, 0, 99999999], [5, 99999999, 0]]

 

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹

๋ชจ๋“  ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์ €์žฅ

C++์ด๋‚˜ Java์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ๋ณ„๋„๋กœ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Python์€ ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์ด append()์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋‹จ์ˆœํžˆ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

graph = [[] for _ in range(3)]

# ๋…ธ๋“œ 0์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ : (๋…ธ๋“œ, ๊ฐ„์„ )
graph[0].append((1, 7))
graph[0].append((2, 5))

graph[1].append((0, 7))

graph[2].append((0, 5))

print(graph)        # [[(1, 7), (2, 5)], [(0, 7)], [(0, 5)]]

 

๋‘ ๋ฐฉ์‹์˜ ์ฐจ์ด

  ๋ฉ”๋ชจ๋ฆฌ ์†๋„
์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹ ๋ชจ๋“  ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ
๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐœ์ƒ
๋น ๋ฅด๋‹ค
์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋งŒ๋“ค ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—
ํšจ์œจ์ 
์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์–ป๋Š” ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋…ธ๋“œ 1๊ณผ ๋…ธ๋“œ 7์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ

์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹์—์„œ๋Š” graph[1][7]๋งŒ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์—์„œ๋Š” ๋…ธ๋“œ 1์— ๋Œ€ํ•œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์•ž์—์„œ ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ํŠน์ •ํ•œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๊ฒฝ์šฐ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋‚ญ๋น„๊ฐ€ ์ ๋‹ค.


DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํŠน์ • ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ํŠน์ • ์ƒํ™ฉ์—์„œ ์ตœ๋Œ€ํ•œ ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€์„œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„, ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

DFS๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.

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

โ€ป ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ๊ด€ํ–‰์ ์œผ๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ˆœ์„œ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ


๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๋ฅผ DFS ํƒ์ƒ‰์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

์‹œ์ž‘ ๋…ธ๋“œ 1์„ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

 
 
 
 
 
 
1


์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 1

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 2, 3, 8 => ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ 2๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

 
 
 
 
 
2
1


์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 2

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 7 => ๋…ธ๋“œ 7์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

 
 
 
 
7
2
1

 

์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 7

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 6, 8 => ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ 6์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

 
 
 
6
7
2
1


์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 6

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค => ์Šคํƒ์—์„œ 6๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.

 
 
 
 
7
2
1


์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 7

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 8 => ๋…ธ๋“œ 8์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

 
 
 
8
7
2
1

 

์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 8

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค => ์Šคํƒ์—์„œ 8๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.

 
 
 
 
7
2
1

 

์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 7

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค => ์Šคํƒ์—์„œ 7๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.

 
 
 
 
 
2
1

 

์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 2

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค => ์Šคํƒ์—์„œ 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.

 
 
 
 
 
 
1

 

์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 1

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 3 => ๋…ธ๋“œ 3์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

 
 
 
 
 
3
1

 

์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 3

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 4, 5 => ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ 4๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

 
 
 
 
4
3
1

 

์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 4

๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ 5 => ๋…ธ๋“œ 5๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

 
 
 
5
4
3
1

 

๋‚จ์€ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค.

 

 

 

 

 

 

 

 

 

 

 

๋…ธ๋“œ์˜ ํƒ์ƒ‰ ์ˆœ์„œ (์Šคํƒ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ)

1 - 2 - 7 - 6 - 8 - 3 - 4 - 5

 

DFS๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ์— ๊ธฐ์ดˆ ํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค.

์‹ค์ œ๋กœ๋Š” ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ ํƒ์ƒ‰ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ O(N)์ด ์†Œ์š”๋œ๋‹ค.

์‹ค์ œ ๊ตฌํ˜„์€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ ๋งค์šฐ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.


ํŒŒ์ด์ฌ ์ฝ”๋“œ

def dfs(graph, v, visited):
    visited[v] = True       # ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ๋ฆฌ์ŠคํŠธ 
    print(v, end=' ')

    for i in graph[v]:      # ๋…ธ๋“œ v์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค 
        if not visited[i]:  # ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ผ๋ฉด 
            dfs(graph, i, visited)

graph = [[],
         [2, 3, 8], # ๋…ธ๋“œ 1์— ์ธ์ ‘ํ•œ ๋…ธ๋“œ 
         [1, 7],    # ๋…ธ๋“œ 2์— ์ธ์ ‘ํ•œ ๋…ธ๋“œ 
         [1, 4, 5], # ๋…ธ๋“œ 3์— ์ธ์ ‘ํ•œ ๋…ธ๋“œ 
         [3, 5],
         [3, 4],
         [7],
         [2, 6, 8],
         [1, 7] ]

visited = [False] * 9

dfs(graph, 1, visited)  # ์‹œ์ž‘๋…ธ๋“œ 1

 

728x90