Algorithm/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€

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

meeeeejin 2021. 3. 23. 10:36

๋ชฉ์ฐจ

  • DFS์˜ ๊ฐœ๋…
  • DFS์˜ ์žฅ๋‹จ์ 
  • DFS์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„
  • DFS์˜ ๊ตฌํ˜„

 

 

 

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

  • DFS(Depth-First Search) ๋˜๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ  ๋ถ€๋ฆ„
  • ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ ๋˜๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•จ

 

 

DFS์˜ ๋™์ž‘ ๊ณผ์ •

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

 

 

 

DFS์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  • ํ˜„์žฌ ๊ฒฝ๋กœ ์ƒ์˜ ๋…ธ๋“œ๋“ค๋งŒ์„ ๊ธฐ์–ตํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ €์žฅ๊ณต๊ฐ„์˜ ์ˆ˜์š”๊ฐ€ ๋น„๊ต์  ์ ๋‹ค
  • ๋ชฉํ‘œ ๋…ธ๋“œ๊ฐ€ ๊นŠ์€ ๋‹จ๊ณ„์— ์žˆ์„ ๊ฒฝ์šฐ ๋‹ต์„ ๋นจ๋ฆฌ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋‹จ์ 

  • ๋‹ต์ด ์—†๋Š” ๊ฒฝ๋กœ์— ๊นŠ์ด ๋น ์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฏธ๋ฆฌ ์ง€์ •ํ•œ ์ž„์˜์˜ ๊นŠ์ด๊นŒ์ง€๋งŒ ํƒ์ƒ‰ํ•˜๊ณ  ๋ชฉํ‘œ ๋…ธ๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋‹ค์Œ์˜ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 
  • ์–ป์–ด์ง„ ๋‹ต์ด ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ๋œ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๋‹ค. ๋ชฉํ‘œ์— ์ด๋ฅด๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋‹ค์ˆ˜์ธ ๋ฌธ์ œ์—์„œ DFS๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ์œผ๋ฉด ํƒ์ƒ‰์ด ์ข…๋ฃŒ๋˜๋ฏ€๋กœ ์ด๋•Œ ์–ป์–ด์ง„ ๊ฒฝ๋กœ๊ฐ€ ์ตœ์ ์ด ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

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

  • N: ๋…ธ๋“œ์˜ ์ˆ˜, E: ๊ฐ„์„ ์˜ ์ˆ˜
  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„๋œ ๊ทธ๋ž˜ํ”„: O(N+E)
  • ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„๋œ ๊ทธ๋ž˜ํ”„: O(N^2)

 

 

 

DFS์˜ ๊ตฌํ˜„

์Šคํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด Python์œผ๋กœ ๊ตฌํ˜„

# graph[i]๋Š” i๋ฒˆ์งธ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จ
graph = [
    [1, 2, 4],
    [0, 2],
    [0, 1, 3, 4],
    [2, 4],
    [0, 2, 3]
]

# ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ
visited = [False] * 5

# DFS
def dfs(v):
    # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    visited[v] = True
    print(v, end = ' ')     # 0 1 2 3 4
    # ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ ๋ฐฉ๋ฌธ
    for x in graph[v]:
        if not visited[x]:
            dfs(x)

# 0๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ DFS ์‹คํ–‰
dfs(0)

 

 

 

 

์ฐธ๊ณ 

 

 

 

728x90