์๊ณ ๋ฆฌ์ฆ/์๊ณ ๋ฆฌ์ฆ ๊ฐ๋
[์๊ณ ๋ฆฌ์ฆ] ๋๋น์ฐ์ ํ์(BFS)์ด๋
์ธํฌ๋งํฑ
2024. 11. 5. 15:33
1. ๋๋น ์ฐ์ ํ์ BFS ( Breadth-First Search )
BFS๋ ๋๋น ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์์ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. BFS๋ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ธ ๋ค์ ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ๋ค.
- ๋ ์ด์ 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)