์๊ณ ๋ฆฌ์ฆ ๐ก
์ก์์ง ์ฐพ๊ธฐ (BFS)
@ENFJ
2025. 3. 10. 22:22
์ก์์ง ์ฐพ๊ธฐ (BFS: Breadth First Search) ๋ฌธ์ ๋ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ธ **๋๋น ์ฐ์ ํ์(BFS)**์ ํ์ฉํ์ฌ ํด๊ฒฐํ๋ ๋ํ์ ์ธ ๋ฌธ์ ์์.
์ ์ฒด์ฝ๋
import sys
from collections import deque
sys.stdin = open("C:/Users/csh/Documents/์ฝ๋ฉํ
์คํธ/BFS/input.txt", "r")
# 5 14
# ์ก์์ง ์ฐพ๊ธฐ (BFS)
MAX = 10000
ch = [0] * (MAX + 1) # ๋ฐฉ๋ฌธ์ฌ๋ถ ํ์ธ
dis = [0] * (MAX + 1) # ์ก์์ง๊น์ง์ ๊ฑฐ๋ฆฌ
n,m = map(int,input().split()) # n: ํ์์ ์์น, m: ์ก์์ง์ ์์น
ch[n] = 1 # ํ์์ ์์น ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
dis[n] = 0 # ํ์์ ์์น๊น์ง์ ๊ฑฐ๋ฆฌ๋ 0
dq = deque() # deque ์์ฑ
dq.append(n) # ํ์์ ์์น๋ฅผ deque์ ๋ฃ๊ธฐ
while dq: # deque๊ฐ ๋น๋๊น์ง ๋ฐ๋ณต
now = dq.popleft() # ํ์์ ์์น๋ฅผ deque์์ ๊บผ๋ด๊ธฐ
if now == m: # ์ก์์ง์ ์์น์ ๋์ฐฉํ๋ฉด ์ข
๋ฃ
break # ์ก์์ง์ ์์น์ ๋์ฐฉํ๋ฉด ์ข
๋ฃ
for next in (now -1, now +1 , now +5): # ์ธ๊ฐ์ง ๊ฒฝ์ฐ์ ์
if 0 < next <= MAX: # ๋ฒ์์์ ์์๋
if ch[next] == 0: # ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
dq.append(next) # deque์ ๋ฃ๊ธฐ
ch[next] = 1 # ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
dis[next] = dis[now] + 1 # ๊ฑฐ๋ฆฌ๊ณ์ฐ
print(dis[m]) # ์ก์์ง๊น์ง์ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
๐ ๋ฌธ์ ์ค๋ช
์์ง์ ์์ ํ์์ ์ก์์ง๊ฐ ์์นํด ์์ต๋๋ค.
- ํ์๋ ํ์ฌ ์ N์ ์๊ณ , ์ก์์ง๋ ์ M์ ์์ด์.
- ํ์๋ +1, -1, ×2 ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ํ ์ ์์ด์.
- ์ต์ ๋ช ๋ฒ์ ์ด๋์ผ๋ก ์ก์์ง์๊ฒ ๊ฐ ์ ์๋์ง ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ (BFS ํ์ฉ)
BFS (๋๋น ์ฐ์ ํ์)์ ์ฌ์ฉํ๋ ์ด์ ๋ "์ต๋จ ๊ฑฐ๋ฆฌ"๋ฅผ ์ฐพ๋ ๋ฐ ์ต์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๊ธฐ ๋๋ฌธ์ด์์.
DFS(๊น์ด ์ฐ์ ํ์)๋ ํน์ ๊ฒฝ๋ก๋ฅผ ๋๊น์ง ํ์ํ ํ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๋ฐฉ์์ด๋ผ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฌธ์ ์ ์ ํฉํ์ง ์์์.
BFS์์๋ ํ(Queue)๋ฅผ ํ์ฉํด์ ํ ๋จ๊ณ์ฉ ์ด๋ํ๋ฉด์ ํ์ํฉ๋๋ค.
๐ ๊ตฌํ ๋ฐฉ๋ฒ
- ํ(Queue) ์ด๊ธฐํ
- Queue์ ํ์์ ์์ ์์น(N)๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ๋์์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ์ธํ visited ๋ฆฌ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
- BFS ํ์ ์์
- while๋ฌธ์ ์ฌ์ฉํ์ฌ ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
- ํ์ฌ ์์น์์ ์ด๋ํ ์ ์๋ 3๊ฐ์ง ๊ฒฝ์ฐ (+1, -1, ×2)๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ง์ฝ ์ก์์ง ์์น(M)์ ๋์ฐฉํ๋ฉด ๋ฐ๋ก ์ข ๋ฃํ๊ณ ์ด๋ ํ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์์น๋ ํ์ ์ถ๊ฐํ๊ณ , visited ๋ฐฐ์ด์ ์ฒดํฌํฉ๋๋ค.
- ์ต์ ํ์ ๋ฐํ
- BFS์ ํน์ฑ์ ์ฒ์ M์ ์ฐพ๋ ์๊ฐ์ด ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ์ฐ์ด๋ฏ๋ก, ๋ฐ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.