๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)

BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

1. BFS(Breadth-First Search)๋ž€?


BFS์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋ž€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด๋Š” ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ๋œป์ด๋‹ค.

DFS๋Š” ์ตœ๋Œ€ํ•œ ๋ฉ€๋ฆฌ์žˆ๋Š”(๊นŠ์€) ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š”๊ฒƒ์— ๋น„ํ•ด BFS๋Š” ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋ฏ€๋กœ ์ด ๋‘๊ฐœ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

BFS ๊ตฌํ˜„์—์„œ๋Š” ์„ ์ž…์„ ์ถœ, ์ฆ‰ ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ •์„์ด๋‹ค.


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

2. ์˜ˆ์‹œ ์ฝ”๋“œ


from collections import deque  

def bfs(graph, start, visited):  
  q = deque([start])                  # q์„ ์–ธ (start๋ฅผ ์ฒซ ์ธ์ž๋กœ ๋„ฃ์Œ)  
  visited[start] = True               # ๋ฐฉ๋ฌธ ํ‘œ์‹œ  
  while q:                          # q๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€  
    v = q.popleft()                   # ๊ฐ€์žฅ์™ผ์ชฝ(๊ฐ€์žฅ๋จผ์ €)์›์†Œ ๋ฝ‘์•„์„œ v์— ๋Œ€์ž…  
    print(v, end = ' ')  
    for i in graph[v]:  
      if not visited[i]:  
        q.append(i)  
        visited[i] = True  

n = int(input())                      # ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜  
graph = [[] * (n + 1)]  

for _ in range(1, n+1):  
  array = list(map(int, input().split()))  
  graph.append(array)  

visited = [False] * (n + 1)         #[0]์€ ์‚ฌ์šฉ x  

bfs(graph, 1, visited)  

3. ์˜ˆ์‹œ ์ž…์ถœ๋ ฅ

  (๊ฐ™์€ ํ–‰์€ ํ•ด๋‹นํ–‰์˜ index์™€ ์—ฐ๊ฒฐ๋œ๊ฒƒ์ด๋‹ค. (๋…ธ๋“œ1์€ ๋…ธ๋“œ2,๋…ธ๋“œ3,๋…ธ๋“œ8๊ณผ ์—ฐ๊ฒฐ))

  ์ž…๋ ฅ:
  (๋…ธ๋“œ1)  2 3 8  
  (๋…ธ๋“œ2)  1 7  
  (๋…ธ๋“œ3)  1 4 5  
  (๋…ธ๋“œ4)  3 5  
  (๋…ธ๋“œ5)  3 4  
  (๋…ธ๋“œ6)  7  
  (๋…ธ๋“œ7)  2 6 8  
  (๋…ธ๋“œ8)  1 7  

  ์ถœ๋ ฅ:
  ๋…ธ๋“œ 1์—์„œ bfs๋ฅผ ๊ตฌํ•˜๋ฉด  
  output = 1 2 3 8 7 4 5 6