๋ชฉ์ฐจ
- BFS์ ๊ฐ๋
- BFS์ ์ฅ๋จ์
- BFS์ ์๊ฐ ๋ณต์ก๋
- BFS์ ๊ตฌํ
BFS(๋๋น ์ฐ์ ํ์)์ด๋?
- BFS(Breadth First Search) ๋๋ ๋๋น ์ฐ์ ํ์์ด๋ผ๊ณ ํจ
- ์์ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ๊น์ด ์ ์ ์ ๋จผ์ ๋ฐฉ๋ฌธํ๋ ๊ทธ๋ํ ํ์ ๋ฐฉ๋ฒ
- ํ(queue)๋ฅผ ์ด์ฉํด ๋ฐฉ๋ฌธํ ์ ์ ๋ค์ ์ฐจ๋ก๋ก ์ ์ฅํ๊ณ ๊บผ๋
BFS์ ๋์ ๊ณผ์
- ํ์ ์์ ์ ์ ์ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
- ํ์์ ์ ์ ์ ๊บผ๋ธ ๋ค์ ํด๋น ์ ์ ์ ์ธ์ ์ ์ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค.
- ๋ ์ด์ 2๋ฒ์ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
BFS์ ์ฅ๋จ์
์ฅ์
- ์์ ์ ์ ์์ ๋ชฉํ ์ ์ ๊น์ง์ ์ต๋จ ๊ธธ์ด ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅํ๋ค.
๋จ์
- ๊ฒฝ๋ก๊ฐ ๋งค์ฐ ๊ธธ ๊ฒฝ์ฐ, ํ์ ๊ฐ์ง๊ฐ ๊ธ๊ฒฉํ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ง์ ๊ธฐ์ต ๊ณต๊ฐ์ด ํ์ํ๋ค.
- ๋ต์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ ํ ๊ทธ๋ํ(finite graph)์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๊ทธ๋ํ๋ฅผ ํ์ํ ํ ์คํจ๋ก ๋๋๋ค.
- ๋ฌดํ ๊ทธ๋ํ(infinite graph)์ ๊ฒฝ์ฐ์๋ ๋ต์ ์ฐพ์ง ๋ชปํ๊ณ , BFS๊ฐ ๋๋์ง๋ ์๋๋ค.
BFS์ ์๊ฐ ๋ณต์ก๋
- N: ๋ ธ๋์ ์, E: ๊ฐ์ ์ ์
- ์ธ์ ๋ฆฌ์คํธ๋ก ํํ๋ ๊ทธ๋ํ: O(N+E)
- ์ธ์ ํ๋ ฌ๋ก ํํ๋ ๊ทธ๋ํ: O(N^2)
BFS์ ๊ตฌํ
# graph[i]๋ i๋ฒ์งธ ๋
ธ๋์ ์ธ์ ํ ๋
ธ๋ ๋ฒํธ๋ฅผ ํฌํจ
graph = [
[1, 2, 4],
[0, 2],
[0, 1, 3, 4],
[2, 4],
[0, 2, 3]
]
# ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฆฌ์คํธ
visited = [False] * 5
# queue ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ์ ์ํด
from collections import deque
# BFS
def bfs(start):
# ์์ ์ ์ ํ ์ฝ์
๋ฐ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
queue = deque([start])
visited[start] = True
# ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while queue:
v = queue.popleft()
print(v, end = ' ') # 0 1 2 4 3
for x in graph[v]:
if not visited[x]:
queue.append(x)
visited[x] = True
# 0์ ์์ ์ ์ ์ผ๋ก BFS
bfs(0)
์ฐธ๊ณ
- github.com/ndb796/python-for-coding-test
- https://ko.wikipedia.org/wiki/๋๋น_์ฐ์ _ํ์
- C์ธ์ด๋ก ์ฝ๊ฒ ํ์ด์ด ์๋ฃ๊ตฌ์กฐ
728x90