Updated:

DFS์™€ BFS๋Š” ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.


Graph

๊ทธ๋ž˜ํ”„๋Š” Node์™€ ์ด Node๋“ค์„ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” Edge๋กœ ํ‘œํ˜„๋œ๋‹ค.
๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด๋ž€ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ ๋‹ค์ˆ˜์˜ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.


๊ทธ๋ž˜ํ”„๋Š” 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์ธ์ ‘ ํ–‰๋ ฌ(Adjacency Matrix) : 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹
    • ๋ชจ๋“  ๋…ธ๋“œ๋“ค์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • ํŒŒ์ด์ฌ์—์„œ๋Š” 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
  2. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacency List) : ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹
    • ๊ฐ ๋…ธ๋“œ๋“ค์˜ ์—ฐ๊ฒฐ๋œ ๊ด€๊ณ„๋งŒ์„ ์ €์žฅํ•œ๋‹ค.
    • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒŒ์ด์ฌ์—์„œ๋Š” 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.


DFS

Depth-First Search, ์ตœ๋Œ€ํ•œ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

์–ด๋–ค ์ž„์˜์˜ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋‹ค์Œ ๋ถ„๊ธฐ(branch)๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ํ•ด๋‹น ๋ถ„๊ธฐ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹


๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  1. ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.
    • ํŒŒ์ด์ฌ์—์„œ ์Šคํƒ์€ ๊ธฐ๋ณธ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
    • append(), pop() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ๋‹ค.
    • โ€™ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. โ€˜
  2. ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.


๋™์ž‘ ๊ณผ์ •

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


์‹œ๊ฐ„ ๋ณต์žก๋„
(์ •์ ์˜ ๊ฐœ์ˆ˜: $V$, ๊ฐ„์„  ๊ฐœ์ˆ˜: $E$)

  • ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด $O(V^2)$
  • ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด $O(V+E)$


์ฝ”๋“œ

def dfs(graph, v, visited):
    visited[v] = True
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)


BFS

Breadth-First Search, ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•œ๋‹ค.


๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  1. ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.
    • ํŒŒ์ด์ฌ์—์„œ collections์˜ deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • โ€™ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. โ€˜


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

  • ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด $O(V^2)$
  • ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด $O(V+E)$


์ฝ”๋“œ

def bfs(graph, v, visited):
    queue = deque([v])
    visited[v] = True
    while queue:
        x = queue.popleft()
        for i in graph[x]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True


DFS vs. BFS
DFS๋ณด๋‹ค๋Š” BFS๊ฐ€ ์กฐ๊ธˆ ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
๊ฒฝ๋กœ์˜ ํŠน์ง•์„ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ DFS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ BFS๊ฐ€ ์œ ๋ฆฌํ•˜๋‹ค. BFS๋Š” ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋จผ์ € ์ฐพ์•„์ง€๋Š” ๊ฒƒ์ด ๊ณง ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๋œ๋‹ค.


Reference

  • ๋‚˜๋™๋นˆ, โŒœ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌโŒŸ

Leave a comment