๋ฌธ์
N×M์ ํ๋ ฌ๋ก ํํ๋๋ ๋งต์ด ์๋ค. ๋งต์์ 0์ ์ด๋ํ ์ ์๋ ๊ณณ์ ๋ํ๋ด๊ณ , 1์ ์ด๋ํ ์ ์๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ๋น์ ์ (1, 1)์์ (N, M)์ ์์น๊น์ง ์ด๋ํ๋ ค ํ๋๋ฐ, ์ด๋ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ค ํ๋ค. ์ต๋จ๊ฒฝ๋ก๋ ๋งต์์ ๊ฐ์ฅ ์ ์ ๊ฐ์์ ์นธ์ ์ง๋๋ ๊ฒฝ๋ก๋ฅผ ๋งํ๋๋ฐ, ์ด๋ ์์ํ๋ ์นธ๊ณผ ๋๋๋ ์นธ๋ ํฌํจํด์ ์ผ๋ค. ๋ง์ฝ์ ์ด๋ํ๋ ๋์ค์ ํ ๊ฐ์ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒ์ด ์ข ๋ ๊ฒฝ๋ก๊ฐ ์งง์์ง๋ค๋ฉด, ๋ฒฝ์ ํ ๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ฌ๋ ๋๋ค. ํ ์นธ์์ ์ด๋ํ ์ ์๋ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ด๋ค. ๋งต์ด ์ฃผ์ด์ก์ ๋, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด ๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ M๊ฐ์ ์ซ์๋ก ๋งต์ด ์ฃผ์ด์ง๋ค. (1, 1)๊ณผ (N, M)์ ํญ์ 0์ด๋ผ๊ณ ๊ฐ์ ํ์.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
6 4
0100
1110
1000
0000
0111
0000
์์ ์ถ๋ ฅ 1
15
์์ ์ ๋ ฅ 2
4 4
0111
1111
1111
1110
์์ ์ถ๋ ฅ 1
-1
๋ฌธ์ ํด๊ฒฐ
[์ฒซ๋ฒ์งธ ์๋]
์ฐ์ ๊ฐ์ฅ ๋จผ์ ์๊ฐํ ์์ด๋์ด๋ก๋
1. ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ BFS๋ฅผ ๊ตฌํํ๊ณ
2. ๋งต์ ๋ฒฝ์ ํ๊ฐ ํ๊ดดํ๊ณ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ํ์ํ๊ณ ๋ค์ ๋ฒฝ์ ๋ณต๊ตฌํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํด๊ฐ๋ฉฐ ์ต๋จ ๊ฒฝ๋ก ๊ธธ์ด ํ์
์ด๋ค.
๊ฒฐ๊ณผ๋ ์๊ฐ์ด๊ณผ
ํ์์ ์๋ฅผ ์ค์ฌ์ผ ํ ํ์๊ฐ ์๋ค.
[๋๋ฒ์งธ ์๋]
๋ฒฝ์ ๋ถ์ ๋, ํด๋น ๋ฒฝ์ด ๋ค๋ฅธ ๋ฒฝ๋ค์ ๋๋ฌ์์ฌ ์๋ค๋ฉด ํด๋น ๋ฒฝ์ ๋ถ์๋ ๋ถ์์ง ์๋ ๊ฒฝ๋ก์๋ ์ํฅ์ ์ฃผ์ง ์์ผ๋ ํด๋น ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ํ์์ ์งํํ์ฌ ๋ณด์
์ด๋ฒ์๋ ์คํจ
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผ ํ ํ์๊ฐ ์๋ค.
[์ธ๋ฒ์งธ ์๋]
๋ฒฝ์ ๋ถ์๋ ๊ฒ๊ณผ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๊ฒ์ ๋ถ๋ฆฌํ์ง ์๊ณ ๋์์ ์งํํ์ฌ ๋ฒฝ์ ๋ถ์๋ ์๋๋ฅผ ์ต์ํํ๊ณ , ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉํ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ฌ๋ณด์.
1. ๋ฐฉ๋ฌธ์ ๊ธฐ๋กํ๊ธฐ ์ํ visited ๋ฐฐ์ด์ 3์ฐจ์ ๋ฐฐ์ด๋ก ํ ๋นํ์ฌ x,y ์์น์ ๋ฒฝ์ ๋ถ์์ ์ด ์๋์ง๋ฅผ ๊ธฐ๋กํ๋ ๋ณ์๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๋ฉด์ ์ํ๋ฅผ ๋ช ํํ ๊ด๋ฆฌํ ์ ์๋ค.
# ๋ฒฝ์ ๋ถ์ ๊ฒฝ์ฐ์ ๋ถ์์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ๊ธฐ๋ก
visited = [[[False] * 2 for _ in range(m)] for _ in range(n)]
2. ๋ฒฝ์ ๋ถ์๋ ๊ฒฝ์ฐ์ ๋ถ์์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ํ๋ฒ์ BFS๋ก ๊ณ ๋ คํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก BFS๋ฅผ ํธ์ถํ ๋ญ๋น๋ฅผ ์ค์
# ๋ฒฝ์ ๋ถ์ ๊ฒฝ์ฐ์ ์ํ
if map[nx][ny] == '0' and not visited[nx][ny][broken]:
visited[nx][ny][broken] = True
queue.append((nx, ny, broken, dist + 1))
# ๋ฒฝ์ ๋ถ์์ง ์์๊ณ , ์์ ๋ฒฝ์ด ์์
elif map[nx][ny] == '1' and not broken:
visited[nx][ny][1] = True
queue.append((nx, ny, 1, dist + 1))
์ต์ข ์ ์ผ๋ก ์์ฑ๋ ์ฝ๋๋ ์๋์ ๊ฐ๋ค
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
map = [list(input().strip()) for _ in range(n)]
direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]
def check(a, b, n, m):
return 0 <= a < n and 0 <= b < m
def bfs():
visited = [[[False] * 2 for _ in range(m)] for _ in range(n)]
# x, y, ๋ฒฝ ๋ถ์๋์ง ์ฌ๋ถ, ํ์ฌ ๊ฑฐ๋ฆฌ
queue = deque([(0, 0, 0, 1)])
while queue:
x, y, broken, dist = queue.popleft()
print(x,y,broken,dist)
# ๋์ฐฉ์ง์ ๋๋ฌํ๋ค๋ฉด ๊ฑฐ๋ฆฌ ๋ฐํ
if x == n - 1 and y == m - 1:
return dist
# 4๋ฐฉํฅ ํ์
for d in direction:
nx = x + d[0]
ny = y + d[1]
# ๋งต ๋ฐ์ผ๋ก ๋๊ฐ๋์ง ์ฒดํฌ
if check(nx, ny, n, m):
# ์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ์ด๊ณ , ๋ฐฉ๋ฌธํ ์ ์๋์ง ์ฒดํฌ
if map[nx][ny] == '0' and not visited[nx][ny][broken]:
visited[nx][ny][broken] = True
queue.append((nx, ny, broken, dist + 1))
# ์์ ๋ฒฝ์ด ์๊ณ , ๋ฒฝ์ ๋ถ์์ ์๋ ๊ฒฝ์ฐ
elif map[nx][ny] == '1' and not broken:
visited[nx][ny][1] = True
queue.append((nx, ny, 1, dist + 1))
return -1
print(bfs())
'๐์ฝ๋ฉํ ์คํธ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 14938 - ์๊ฐ๊ทธ๋ผ์ด๋ (Python) (0) | 2024.08.23 |
---|---|
[๋ฐฑ์ค] 9251 - LCS (Python) (0) | 2024.08.22 |
[๋ฐฑ์ค] 9663 - N Queen (Python) (0) | 2024.08.20 |
[๋ฐฑ์ค] 1916 - ์ต์ ๋น์ฉ ๊ตฌํ๊ธฐ (Python) (0) | 2024.08.19 |
[๋ฐฑ์ค] 11404 - ํ๋ก์ด๋ (Python) (0) | 2024.08.19 |