Algo-dfs.md


  • ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋…


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

DFS - Depth First Search

dfsimg

ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€(๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ๊นŒ์ง€) ํƒ์ƒ‰ํ•œ ๋’ค ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰์„ ํ•˜๋Š” ๋ฐฉ์‹

โ˜ ํŠน์ง•

  • ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๋•Œ ํ™œ์šฉํ•˜๊ธฐ ์ข‹์€ ๋ฐฉ์‹

  • BFS์— ๋น„ํ•ด ๊ฐ„๋‹จ

  • ๋‹จ์ˆœ ๊ฒ€์ƒ‰ ์†๋„๋Š” BFS์— ๋น„ํ•ด ๋А๋ฆผ

โ˜ ํƒ์ƒ‰ ๊ณผ์ •

  • ํ˜„์žฌ ๋…ธ๋“œ์— ์ธ์ ‘ํ•˜๊ณ  ๋ฐฉ๋ฌธ๋œ์  ์—†๋Š”(์Šคํƒ์— ์•ˆ์Œ“์ธ) ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ

  • ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ์ธ์ ‘ํ•˜๊ณ  ๋ฐฉ๋ฌธ๋œ ์  ์—†๋Š” ๋…ธ๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ backtrackingํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค.

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

  • ๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. dfsimage

  • Adjacency Matrix - ์ธ์ ‘ ํ–‰๋ ฌ

#์œ„์˜ ๊ทธ๋ž˜ํ”„๋ฅผ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•˜๋ฉด
graph = [
    [0,1,1,1],
    [1,0,0,1],
    [1,0,0,1],
    [1,1,1,0]
]
  • Adjacency List - ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

#์œ„์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(1์ฐจ์› ๋ฆฌ์ŠคํŠธ)๋กœ ํ‘œํ˜„ํ•˜๋ฉด
graph [[2,3,4],[1,4],[1,4]],[1,2,3]
  • ์‹ค์ œ ๊ตฌํ˜„

def dfs(graph, v, visited):
    #V : ํ˜„์žฌ ๋…ธ๋“œ
    visited[v] = True
    print(v, end=' ')
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited) #ํ˜„์žฌ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐฉ๋ฌธ
    

# ์ธ์ ‘๋ฆฌ์ŠคํŠธ ๋ฐฐ์—ด -> graph[][]
# ๋ฐฉ๋ฌธ์—ฌ๋ถ€ ๋ฐฐ์—ด -> visited[]
graph = [
    [],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

visited = [False] * 9
# ์ตœ์ƒ๋‹จ ๋…ธ๋“œ 1
dfs(graph, 1, visited)

Last updated