๋๋น ์ฐ์ ํ์(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๋ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ๋์ํ๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ถ๊ฐํ๊ณ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ํ๋์ฉ ๊บผ๋ด์ด ํด๋น ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
- ํ์ฌ ๋ ธ๋์์ ๊ฐ ์ ์๋ ๋ชจ๋ ์ธ์ ๋ ธ๋๋ฅผ ํ์ ์ถ๊ฐํ๋ค(์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ ์ ์ธ).
- ํ๊ฐ ๋น ๋๊น์ง ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
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์ ๋์ ๋ฐฉ์์ ์ดํดํ๊ณ , ๋ค์ํ ๋ฌธ์ ์ ์ ์ฉํด ๋ณด์๊ธธ ๋ฐ๋๋ค.