๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
[์ด์ฝํ
Ch5-4] ๋ฏธ๋กํ์ถ (BFS)
N x M ํฌ๊ธฐ์ ์ง์ฌ๊ฐํ ํํ์ ๋ฏธ๋ก์ ์ฌ๋ฌ ๋ง๋ฆฌ์ ๊ดด๋ฌผ์ด ์์ด ์ด๋ฅผ ํผํด ํ์ถํด์ผ ํ๋ค. ํ์ฌ ์์น๋ (1, 1)์ด๊ณ ๋ฏธ๋ก์ ์ถ๊ตฌ๋ (N,M)์ ์์น์ ์กด์ฌํ๋ฉฐ ํ ๋ฒ์ ํ ์นธ์ฉ ์ด๋ํ ์ ์๋ค. ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 0์ผ๋ก, ๊ดด๋ฌผ์ด ์๋ ๋ถ๋ถ์ 1๋ก ํ์๋์ด ์๋ค. ๋ฏธ๋ก๋ ๋ฐ๋์ ํ์ถํ ์ ์๋ ํํ๋ก ์ ์๋๋ค. ํ์ถํ๊ธฐ ์ํด ์์ง์ฌ์ผ ํ๋ ์ต์ ์นธ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ผ. ์นธ์ ์ ๋๋ ์์ ์นธ๊ณผ ๋ง์ง๋ง ์นธ์ ๋ชจ๋ ํฌํจํด์ ๊ณ์ฐํ๋ค.
์ ๋ ฅ
- ์ฒซ์งธ ์ค์ ๋ ์ ์ N, M(4 <= N, M <= 200)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ๊ฐ M๊ฐ์ ์ ์(0ํน์ 1)๋ก ๋ฏธ๋ก์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์๋ค์ ๊ณต๋ฐฑ ์์ด๋ถ์ด์ ์ ๋ ฅ์ผ๋ก ์ ์๋๋ค. ๋ํ ์์ ์นธ๊ณผ ๋ง์ง๋ง ์นธ์ ํญ์ 1์ด๋ค.
์ถ๋ ฅ
- ์ฒซ์งธ ์ค์ ์ต์ ์ด๋ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์
๋ ฅ ์์
5 6
101010
111111
000001
111111
111111
์ถ๋ ฅ ์์
10
โ๏ธIdea Sketch
์๊ณ ๋ฆฌ์ฆ : BFS
์๊ฐ๋ณต์ก๋
2์ฐจ์ ๋งต์์ ์ํ์ข์ฐ 4๋ฐฉํฅ์ผ๋ก ์์ง์ผ ์ ์๊ณ , ํน์ ๋ชฉํ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋, BFS ํ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋๋ O(NM)์ด๋ค. ์ ์ ์ ๊ฐ์๊ฐ O(NM)๊ฐ์ด๊ณ , ๊ฐ ์ ์ ์์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด 4๊ฐ์ฉ์ด๋๊น ๊ฐ์ ์ ์ด ๊ฐ์๋ O(4NM)์ธ๋ฐ, ์์๋ฐฐ๋ ๋ฌด์ํ ์ ์์ผ๋ฏ๋ก ๋๊ฐ์ด O(NM)์ผ๋ก ์ธ ์ ์๋ค. BFS ํ์ ๊ณผ์ ์์ ์ ์ ์ O(NM)๊ฐ ๋ณด๊ณ ๊ฐ์ ๋ O(NM)๊ฐ ๋ณด๋ O(NM+NM) = O(2NM)์ธ๋ฐ, ์ญ์ ์์๋ฐฐ๋ ๋ฌด์ํ ์ ์์ผ๋ O(NM)์ด๋ค.
โ๏ธ๋ด ์์ค์ฝ๋
- ์ถ๋ฐ์ง (0, 0)์์ ์ถ๋ฐํ์ฌ ๋ชฉ์ ์ง (n-1, m-1)๊น์ง ๋ฏธ๋ก๋ฅผ ํ์ํ๋ค.
- ์ด๋ํ๋ ค๋ ์ขํ (nx, ny)์ ์ขํ๊ฐ์ด 1๋ก ๊ดด๋ฌผ์ด ์๋ ๊ฒฝ์ฐ, ํด๋น ์ขํ๊ฐ์ ๊ฐฑ์ ํ๊ณ queue์ ์ขํ๋ฅผ ์ถ๊ฐํ๋ค.
- ์ต์ข ์ ์ผ๋ก ๋ชฉ์ ์ง (n-1, m-1)์ ์ขํ๊ฐ์ ๋ฆฌํดํ๋ค.
from collections import deque
import sys
si = sys.stdin.readline
def bfs():
queue = deque([[0, 0]])
while queue:
x, y = queue.popleft()
for dx, dy in (-1, 0), (1, 0), (0, -1), (0, 1):
nx, ny = x + dx, y + dy
if (0 <= nx < n) and (0 <= ny < m) and graph[nx][ny] == 1:
graph[nx][ny] = graph[x][y] + 1
queue.append([nx, ny])
return graph[n-1][m-1]
n,m = map(int, si().split())
graph = [list(map(int, si().rstrip())) for _ in range(n)]
print(bfs())