๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS) ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ์ด๋ก ๋ถ€ํ„ฐ Python ๊ตฌํ˜„๊นŒ์ง€

Posted by

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS, Breadth-First Search)์€ ๊ทธ๋ž˜ํ”„ ๋˜๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ ๊ตฌ์กฐ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. BFS๋Š” ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ๋ชจ๋‘ ๋ฐฉ๋ฌธํ•œ ๋’ค, ๊ทธ ๋‹ค์Œ์œผ๋กœ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ์ฆ‰, ๊นŠ๊ฒŒ ํƒ์ƒ‰ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋„“๊ฒŒ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด BFS์˜ ํŠน์ง•์ด๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” BFS์˜ ์ด๋ก ์  ๊ฐœ๋…๋ถ€ํ„ฐ ๊ด€๋ จ ์ž๋ฃŒ ๊ตฌ์กฐ, Python์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

BFS์˜ ์ด๋ก ์  ๋ฐฐ๊ฒฝ

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)์€ ๊ทธ๋ž˜ํ”„๋‚˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค. BFS๋Š” ์ฒซ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋จผ์ € ๋ฐฉ๋ฌธํ•œ ๋’ค, ๊ทธ ๋‹ค์Œ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ๋“ค์„ ์ฐจ๋ก€๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋„“์ด ์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰ํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์—์„œ๋„ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

BFS์˜ ์ฃผ์š” ํŠน์ง•

๋ฐฉ๋ฌธ ์ˆœ์„œ

BFS๋Š” ๋จผ์ € ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„, ์ ์  ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

์ตœ๋‹จ ๊ฒฝ๋กœ

BFS๋Š” ํƒ์ƒ‰ ๊ฒฝ๋กœ์˜ ๊ฐ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ๋™์ผํ•œ ๊ทธ๋ž˜ํ”„์—์„œ ์‹œ์ž‘ ๋…ธ๋“œ์™€ ๋ชฉํ‘œ ๋…ธ๋“œ ๊ฐ„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฐ ์ ํ•ฉํ•˜๋‹ค.

ํ(Queue) ์‚ฌ์šฉ

BFS๋Š” ํƒ์ƒ‰ ๊ณผ์ •์—์„œ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ๋Š” FIFO(First In, First Out) ๊ตฌ์กฐ๋กœ, ๋จผ์ € ์ถ”๊ฐ€๋œ ๋…ธ๋“œ๊ฐ€ ๋จผ์ € ์ฒ˜๋ฆฌ๋œ๋‹ค.

์™„์ „์„ฑ

BFS๋Š” ์œ ํ•œํ•œ ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค.

์ž๋ฃŒ ๊ตฌ์กฐ

BFS๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜ํ”„(Graph)

๊ทธ๋ž˜ํ”„๋Š” ๋…ธ๋“œ(Node)์™€ ๊ทธ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ (Edge)์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
BFS์—์„œ๋Š” ๊ทธ๋ž˜ํ”„์˜ ๊ฐ ๋…ธ๋“œ์™€ ๊ฐ„์„ ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉฐ, ๊ทธ๋ž˜ํ”„๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacency list)๋‚˜ ์ธ์ ‘ ํ–‰๋ ฌ(Adjacency matrix)๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋‹ค.

ํ(Queue)

BFS๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
ํ๋Š” FIFO ๊ตฌ์กฐ๋กœ, ๋จผ์ € ํ์— ๋“ค์–ด๊ฐ„ ๋…ธ๋“œ๊ฐ€ ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ํƒ์ƒ‰์„ ์œ„ํ•ด ๊ฐ ๋…ธ๋“œ๋ฅผ ํ์— ์ฐจ๋ก€๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

๋ฐฉ๋ฌธ ํ‘œ์‹œ(Visited)

BFS์—์„œ๋Š” ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
๋ณดํ†ต ๋ฆฌ์ŠคํŠธ(List)๋‚˜ ์ง‘ํ•ฉ(Set)์„ ์‚ฌ์šฉํ•ด ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ์ถ”์ ํ•œ๋‹ค.

BFS์˜ ๋™์ž‘ ๊ณผ์ •

BFS๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋กœ ๋™์ž‘ํ•œ๋‹ค.

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•œ๋‹ค.
  2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์–ด ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค.
  3. ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค(์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” ์ œ์™ธ).
  4. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

BFS์˜ Python ๊ตฌํ˜„

BFS๋ฅผ Python์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.
์ด ๊ตฌํ˜„์—์„œ๋Š” ํ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

from collections import deque

# ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

# BFS ํ•จ์ˆ˜
def bfs(start_node):
    visited = set()  # ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•  ์ง‘ํ•ฉ
    queue = deque([start_node])  # ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€

    while queue:
        node = queue.popleft()  # ํ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋ƒ„
        if node not in visited:
            print(node, end=' ')  # ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ์ถœ๋ ฅ
            visited.add(node)  # ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ
            queue.extend(graph[node])  # ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ์— ์ถ”๊ฐ€

# BFS ์‹œ์ž‘
bfs('A')

์ฝ”๋“œ ์„ค๋ช…

  • graph: ๊ทธ๋ž˜ํ”„๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ๊ฐ ๋…ธ๋“œ์˜ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ์ •์˜ํ•œ๋‹ค.
  • bfs ํ•จ์ˆ˜: ์ด ํ•จ์ˆ˜๋Š” ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ BFS๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ , ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ทธ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  • queue: ํ๋Š” ํƒ์ƒ‰ํ•  ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํ์— ์ถ”๊ฐ€ํ•˜๊ณ , ๊ทธ ํ›„ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ์— ๋„ฃ์–ด ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

BFS์˜ ํ™œ์šฉ ์‚ฌ๋ก€

BFS๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

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

๊ฒฐ๋ก 

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

Leave a Reply

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค