์•Œ๊ณ ๋ฆฌ์ฆ˜/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ๋…

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS)์ด๋ž€

์ธํฌ๋งˆํ‹ฑ 2024. 11. 5. 15:33

1. ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰ BFS ( Breadth-First Search )

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

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

 

2. BFS ๋™์ž‘ ์˜ˆ์‹œ

  • [Step 0] ๊ทธ๋ž˜ํ”„๋ฅผ ์ค€๋น„ (๋ฐฉ๋ฌธ๊ธฐ์ค€ : ๋ฒˆํ˜ธ๊ฐ€ ๋‚ฎ์€ ์ธ์ ‘๋…ธ๋“œ๋ถ€ํ„ฐ) / ์‹œ์ž‘๋…ธ๋“œ : 1

  • [Step 1] ์‹œ์ž‘๋…ธ๋“œ ‘1’์„ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • [Step 2] ํ์—์„œ ๋…ธ๋“œ ‘1’์„ ๊บผ๋‚ด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘๋…ธ๋“œ ‘2’, ‘3’, ‘8’์„ ํ์— ์‚ฝ์ž…ํ•˜์—ฌ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • [Step 3] ํ์—์„œ ๋…ธ๋“œ ‘2’์„ ๊บผ๋‚ด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘๋…ธ๋“œ ‘7’ ์„ ํ์— ์‚ฝ์ž…ํ•˜์—ฌ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
  • [Step 4] ํ์—์„œ ๋…ธ๋“œ ‘3’์„ ๊บผ๋‚ด ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘๋…ธ๋“œ ‘4’, ‘5’ ์„ ํ์— ์‚ฝ์ž…ํ•˜์—ฌ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
  • [Step 5] ํ์—์„œ ๋…ธ๋“œ ‘8’์„ ๊บผ๋‚ด๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฌด์‹œ
    • ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ „์ฒด ๋…ธ๋“œ์˜ ํƒ์ƒ‰ ์ˆœ์„œ(ํ์— ๋“ค์–ด๊ฐ„ ์ˆœ์„œ)๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ
      โœ”๏ธ ํƒ์ƒ‰ ์ˆœ์„œ : 1 → 2 → leftpop(1) → 3 → 8 → 2(leftpop) → 7 → 3(leftpop) → 4 → 5 → 8(leftpop) → 6

 

 

 

3. BFS ์ฝ”๋“œ

* ์–‘๋ฐฉํ–ฅ ํƒ์ƒ‰ ๊ฐ„์„ 
* ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์˜ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ

from collections import deque

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„(2์ฐจ์› ๋ฆฌ์ŠคํŠธ)
graph = [
    [],
    [2,3,8], #๋…ธ๋“œ 1
    [1,7], #๋…ธ๋“œ 2
    [1,4,5], # ๋…ธ๋“œ 3 ..
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]

# ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋œ ์ •๋ณด๋ฅผ ํ‘œํ˜„(1์ฐจ์› ๋ฆฌ์ŠคํŠธ)
visited = [False]*9

# ์ •์˜๋œ BFS ํ•จ์ˆ˜ ํ˜ธ์ถœ
def bfs(graph, start, visited): #star๋Š” ์‹œ์ž‘๋…ธ๋“œ
    queue = deque([start]) # ์‹œ์ž‘๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์–ด์ค€๋‹ค
    visited[start] = True # ์‹œ์ž‘๋…ธ๋“œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ

    while queue: # ํ ๋นŒ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        v = queue.popleft() # ํ์— ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ์›์†Œ ๋ฝ‘๊ธฐ
        print(v, end=' ') 

        for i in graph[v]: # ํ์˜ ๋งจ ์•ž ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์ด ๋‹ด๊ธด ์ •๋ณด
            if not visited[i]: # ๋งŒ์•ฝ ์ธ์ ‘ํ•œ ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ์ด ์•ˆ๋˜์—ˆ๋‹ค๋ฉด
                queue.append(i)
                visited[i]=True # ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ True ์ฒ˜๋ฆฌ

bfs(graph,1,visited)