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

2020. 8. 25. 16:57ใ†์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค/DFS,BFS

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

 

์˜ค๋Š˜ ๋ฐฐ์›Œ๋ณผ ๋‚ด์šฉ์€ ํƒ์ƒ‰์ด๋‹ค.

 

ํƒ์ƒ‰์ด๋ž€ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.

 

์ด๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š”, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”์‹œ๋˜๋Š” ๊ตฌ์กฐ๋Š” ๋ฐ”๋กœ DFS, BFS ์ด๋‹ค.

 

์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„ ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

์ž๋ฃŒ๊ตฌ์กฐ๋ž€ '๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ'๋ฅผ ๋งํ•œ๋‹ค. 

 

๋Œ€ํ‘œ์ ์œผ๋กœ ์ž๋ฃŒ๊ตฌ์กฐ์—๋Š” ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ์Šคํƒ, ํ, ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ๋Š”๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์Šคํƒ๊ณผ ํ์ด๋‹ค.

 

์Šคํƒ(Stack)

"๋จผ์ € ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋‚˜์˜จ๋‹ค"๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค. ์ด๋ฅผ ์šฐ๋ฆฌ๋Š” FILO(First In Last Out)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

ํŒŒ์ด์ฌ์—์„œ ์Šคํƒ์€ ๊ธฐ๋ณธ ๋ฆฌ์ŠคํŠธ์—์„œ append()์™€ pop()์„ ์ด์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์Šคํƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

 

ํ(Queue)

ํ๋Š” ์Šคํƒ๊ณผ ๋ฐ˜๋Œ€๋กœ, "๋จผ์ € ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜จ๋‹ค"๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค. ์ด๋ฅผ FIFO(First In First Out)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ๋ณดํ†ต Collections ๋ชจ๋“ˆ์—์„œ deque๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด deque๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋บด๋Š” ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ , ๋” ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด ๋‘๊ฐ€์ง€ ์ž๋ฃŒ๊ตฌ์กฐ๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด DFS์™€ BFS์˜ ๊ฐœ๋…์„ ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

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

DFS์˜ ์ •์˜๋Š” ๊นŠ์€๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ธ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์Šคํƒ๊ณผ ์žฌ๊ท€ํ•จ์ˆ˜๋Š” ์ƒ๋‹นํžˆ ๋น„์Šทํ•˜๋‹ค๊ณ  ๋ณผ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ปดํ“จํ„ฐ ๊ตฌ์กฐ์ธก๋ฉด์—์„œ๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๊ณต๊ฐ„์— ์ ์žฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•„์ž๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋กœ DFS๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

DFS๋Š” '๊ทธ๋ž˜ํ”„'์—์„œ ์‚ฌ์šฉ์ด ๋˜๋Š”๋ฐ, ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ธ์ •ํ–‰๋ ฌ๊ณผ ์ธ์ ‘๋ฆฌ์ŠคํŠธ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

์ธ์ ‘ํ–‰๋ ฌ์€ 2์ฐจ์› ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•˜๊ณ , ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋Š” ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๊ฒฐ๊ตญ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ(์ )๋“ค์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด DFS์™€ BFS๋ฅผ ๋ฐฐ์šด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

์ธ์ ‘ํ–‰๋ ฌ๊ณผ ์ธ์ ‘๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋” ์‚ดํŽด๋ณด์ž๋ฉด, ์ธ์ ‘ํ–‰๋ ฌ์€ ์ธ์ ‘๋ฆฌ์ŠคํŠธ์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋Š” ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ์„ ์ €์žฅํ•˜๊ณ , ์ธ์ ‘ํ–‰๋ ฌ์€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒƒ๋“ค๋„ INF(๋ฌดํ•œ๋Œ€)์˜ ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ธ์ ‘๋ฆฌ์ŠคํŠธ๋Š” ์ธ์ ‘ํ–‰๋ ฌ์— ๋น„ํ•ด ํŠน์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ๊ธฐ์— ๊นŒ๋‹ค๋กญ๋‹ค. ์ด์œ ๋Š” ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์œ„์˜ ๊ฐœ๋…๋“ค์„ ์ด์šฉํ•ด ์—ฐ์Šต๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๊ฒ ๋‹ค.

์ด์™€ ๊ฐ™์€ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์šฐ๋ฆฌ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ๋ฌธ์ œ์— ์ฃผ์–ด์กŒ์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ• ๊นŒ?

  1. 1๋ฒˆ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ , ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. 1๋ฒˆ๊ณผ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ์ค‘ ๊ฐ€์žฅ ์ž‘์€๊ฐ’์„ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  3. 2๋ฒˆ์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์Šคํƒ์—์„œ ๊ทธ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค.
  4. 2,3๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.

์žฌ๊ท€ํ•จ์ˆ˜์˜ ํ•ด๊ฒฐ๋ฐฉ์•ˆ์€ ์ด๋ ‡๋‹ค.

   1. DFSํ•จ์ˆ˜์— 1๋ฒˆ ํ•จ์ˆ˜์ธ์ž๋ฅผ ๋„ฃ๋Š”๋‹ค

   2. 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ‘œ์‹œํ•˜๊ณ  ์ถœ๋ ฅํ•œ๋‹ค

   3. 1๋ฒˆ ๋…ธ๋“œ์˜ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ dfsํ•จ์ˆ˜์— ๋„ฃ๋Š”๋‹ค.

   4. ๋ฐ˜๋ณตํ•œ๋‹ค.

 

๊ธ€๋กœ๋งŒ ์ฝ์œผ๋ฉด ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐˆ ๊ฒƒ์ด๋‹ค. ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด์ž.

def dfs(start, visited, graph):
  graph[start] = True
  print(start, end = ' ')
  
  for i in graph[start]:
    if not visited[i]:
      dfs(i,visited,graph)
      
graph = [
            [],
            [2, 4, 5],
            [1, 3, 5],
            [2, 5, 6],
            [1, 5],
            [1, 2, 4, 6],
            [3, 5]
]

visited = [False]*9

dfs(1,visited,graph)

์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ํ•ด์ค˜์•ผ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ์ˆซ์ž๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ํ•ด์ค˜์•ผํ•˜๋Š”์ง€, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ๋ฌธ์ œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

BFS

์œ„์˜ DFS๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค. ์Šคํƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

BFS๋Š” ํ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค. ์ •ํ™•ํžˆ๋Š” Collections๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ deque๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค. 

 

์œ„์˜ ๋ฌธ์ œ๋ฅผ BFS๋ฅผ ํ†ตํ•ด ํ’€์–ด๋ณด์ž.

  1. ํ์— ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ํ๊ฐ€ ๋น„์–ด์žˆ์„ ๋•Œ๊นŒ์ง€ ํ์—๋„ฃ์€ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•˜๊ณ  ์ถœ๋ ฅํ•˜๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ฝ”๋“œ๋Š” ์ด๋ ‡๋‹ค.

 

from collections import deque
def bfs(start, visited, graph):
  queue = deque([start])
  graph[start] = True
  
  while queue:
    x = queue.popleft()
    print(x, end = ' ')
    for i in graph[x]:
      if not visited[i]:
        visited[i] = True
        queue.append(i)
        
graph = [
            [2, 4, 5],
            [1, 3, 5],
            [2, 6],
            [1, 5],
            [1, 2, 4, 6],
            [3, 5]
]

visited = [False] * 9
bfs(1, visited, graph)

๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด visited๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์„ผ์Šค์žˆ๊ฒŒ ์“ฐ๋„๋ก ํ•˜์ž.