https://www.acmicpc.net/problem/2206
ํ์ด
์ฒ์์ 14502๋ฒ - ์ฐ๊ตฌ์ ๋ฌธ์ ์ฒ๋ผ ๋งต(๊ทธ๋ํ)์ ํ๋ํ๋ ๋๋ฉด์ ๋ฒฝ์ด ์๋ค๋ฉด ๊ทธ ๋ฒฝ์ ๋ถ์๊ณ bfs ๋๋ ค๋ณด๊ณ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์๋๋ฉด ๋ค์ ๊ทธ ์๋ฆฌ์ ๋ฒฝ์ ์ธ์ฐ๊ณ ๋ค๋ฅธ ๋ฒฝ์ ๋ถ์์ด๋ณด๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ ค๊ณ ์ฝ๋๋ฅผ ์งฐ๋๋ฐ, ์๊ฐ ์ด๊ณผ ๊ฐ ๋์๊ณ ๋ ๋ฒ์งธ ์๋์๋ ํ๋ ธ์ต๋๋ค ๊ฐ ๋์๋ค. ๊ทธ๋์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์๋ํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ผ๋ก ๋ค๋ฅธ ๋ถ๋ค์ ํ์ด ๋ฐฉ๋ฒ์ ๋ณด์๊ณ ๋, 2206๋ฒ ๋ฌธ์ FAQ ๊ธ์ด ์๊ธธ๋ ๋ดค๋๋ฐ...
์ผ๋จ ์ด ํด๊ฒฐ ๋ฐฉ์์ ์ ๋ต์ด ๋ ์ ์๋ค. ์ด์ ๋ 2๊ฐ์ง๊ฐ ์์๋๋ฐ, ์ฒซ ๋ฒ์งธ๋ ์๊ฐ ๋ณต์ก๋๊ฐ ๋๋ฌด ํฌ๊ฒ ๋์ค๋ ๊ฒ์ด๋ค. ์ฐ๊ตฌ์ ๋ฌธ์ ๊ฐ์ ๊ฒฝ์ฐ์๋ N, M ๋ฒ์๊ฐ ์์์ ํ๋ํ๋ ๋ฐฉ๋ฌธํด๋ ์๊ฐ ๋ณต์ก๋๊ฐ ํฌ์ง ์์์ง๋ง ์ด ๋ฌธ์ ๋ N, M์ ๋ฒ์๊ฐ 1,000์ด๋ผ์ ๋จ์ํ๊ฒ ์๊ฐํด๋ 1000 * 1000 ์ด๋ผ๋ ์๋นํ ์๊ฐ์ด ์์๋๋ค.
๋ ๋ฒ์งธ๋ (N, M)์ผ๋ก ๊ฐ๋ ๊ธธ๋ชฉ์ด ๋ฒฝ์ผ๋ก ๋งํ์๋ ์ํฉ์์ ๊ทธ ๋ฒฝ๊น์ง ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๋ฒฝ์ ๋ถ์ ๊ฒฝ์ฐ์ ๋ถ์์ง ์์ ๊ฒฝ์ฐ ๋ ์ค ๋ถ์ ๊ฒฝ์ฐ๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ์ผ ๋, ์ด๋ฏธ ๋ฒฝ์ ํ ๋ฒ ๋ถ์๊ธฐ ๋๋ฌธ์ (N, M)์ผ๋ก ๊ฐ ์๊ฐ ์์ด -1์ ์ถ๋ ฅํ๊ฒ ๋๋ค. ์ฆ, ํ์ฌ ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์ง๊ธ ๋น์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ์๋์ง๋ผ๋ (N, M)์ผ๋ก ๊ฐ ์ ์๋ ๋จ ํ๋์ ๋ฐฉ๋ฒ์ด๋ผ๋ฉด ๊ทธ ๊ฒฝ๋ก๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๋๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ฒ์ ์๊ฐํด๋ธ ๋ฐฉ๋ฒ์ ํด๊ฒฐ ๋ฐฉ์์ด ๋ ์ ์์๋ค.
๊ทธ๋ผ, ์ด์ ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ฉด์ ์ ๋ต์ ์ฐพ์๋ณด์. ๋จผ์ ์ฒซ ๋ฒ์งธ ๋ฌธ์ ์ ์ธ ๋ชจ๋ ์์์ ๋ฒฝ์ ํ๋ฌผ์ด๋ณธ๋ค๋ ๋ฌด์์ ํ๋ฌผ๊ณ bfs๋ฅผ ๋๋ ค๋ณด๋ ๊ฒ์ด ์๋ bfs๋ฅผ ๋จผ์ ๋๋ ค๋ณด๊ณ ๊ทธ ๊ณผ์ ์์ ๊ฐ๋ ๊ฒฝ๋ก์ ๋ฒฝ์ด ์๊ณ , ์ด ๊ฒฝ๋ก๋ ๋ฒฝ์ ํ๋ฌธ ์ ์ด ์๋ค๋ฉด ํ๋ฌผ์ด๋ณด์ ๋ก ํด๊ฒฐํ ์ ์๋ค. ์ฆ, ๋งต(๊ทธ๋ํ) ๊ฐ๊ฐ์ ์์์ ๊ฒฝ๋ก์ ๋ฐ๋ผ "๋ฒฝ์ ํ๋ฌผ์๋?" ์ ๋ํ ์ ๋ณด๋ฅผ ์ฃผ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด๋ ๊ณง ๋ ๋ฒ์งธ ๋ฌธ์ ๋ก ์ด์ด์ง๋ค. ์๋ํ๋ฉด (N, M) ์ง์ ์ด ๋ฒฝ์ผ๋ก ๋๋ฌ์ ธ์์ ๋ (N, M) ์ง์ ์ ๋ฒฝ๊น์ง ์ด๋ค ๋ฒฝ์ ํ๋ฌผ๊ณ ์จ ๊ฒฝ๋ก์ ํ๋ฌผ์ง ์๊ณ ์จ ๊ฒฝ๋ก ์ค ํ๋ฌธ ๊ฒฝ๋ก๊ฐ ๋ ์ต๋จ ๊ฒฝ๋ก๋ผ๋ฉด ์ด ๊ฒฝ๋ก์ ๊ฐ๊ฐ์ ๊ธธ์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ๊ธฐ๋ก๋๊ธฐ ๋๋ฌธ์ ํ๋ฌผ์ง ์์ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฐฉ๋ฌธ์ ํ ์ ์๊ฒ ๋๋ค. ์ฆ, (N, M) ์ง์ ์ผ๋ก ๊ฐ ์ ์๊ฒ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ฒฝ์ ํ๋ฌธ ๊ฒฝ์ฐ์ ํ๋ฌผ์ง ์์ ๊ฒฝ์ฐ ๋๋ก ๋๋์ด ์ฃผ๋ฉด ๋๋ค! ๊ทธ๋ฌ๋ฉด ๋ฒฝ์ ํ๋ฌธ ๊ฒฝ์ฐ์ ๋จผ์ ๋ฐฉ๋ฌธํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ง๋ค์๋คํด๋ ํ๋ฌผ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ค๋ฆ๊ฒ ๋ฐฉ๋ฌธํ์ฌ (N, M) ์ง์ ์ผ๋ก ๊ฐ ์ ์๊ฒ ๋๋ค.
์ ๋ฆฌํ์๋ฉด, bfs ํ์์ ๋๋ฆฌ๋ฉด์ ๊ฐ๊ฐ์ ๊ฒฝ๋ก์ ๋ฒฝ์ ํ๋ฌผ๊ณ ๊ฐ๋ ๊ฒฝ๋ก์ธ์ง๋ฅผ ํ์ํ๊ณ , ๊ฒฝ๋ก์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ํ๋ฌผ๊ณ ๊ฐ๋ ๊ฒฝ์ฐ์ธ์ง ํ๋ฌผ์ง ์๊ณ ๊ฐ๋ ๊ฒฝ์ฐ์ธ์ง ๋๋์ด ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณผ์ ์์ (N, M) ์ง์ ์ผ๋ก ๋จผ์ ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์ต์ข ์ ์ผ๋ก ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋๋ค.
์ฝ๋
import sys, copy
from collections import deque
input = sys.stdin.readline
N, M = map(int, input().split())
path = [list(map(int, input().rstrip())) for _ in range(N)]
visited =[[[0, 0] for i in range(M)] for _ in range(N)]
wasd = ((0, -1), (0, 1), (-1, 0), (1, 0))
def bfs(start_x, start_y):
queue = deque()
queue.append([start_x, start_y, 0])
visited[start_y][start_x][0] = True
dist = copy.deepcopy(path)
dist[start_y][start_x] = 1
while queue:
x, y, wall_break = queue.popleft()
if x == M-1 and y == N-1:
return dist[y][x]
for xx, yy in wasd:
xx += x
yy += y
if (0 <= xx < M) and (0 <= yy < N):
if path[yy][xx] == 0:
if not visited[yy][xx][wall_break]:
queue.append([xx, yy, wall_break])
visited[yy][xx][wall_break] = True
dist[yy][xx] = dist[y][x] + 1
elif path[yy][xx] == 1 and wall_break == 0:
if not visited[yy][xx][0]:
queue.append([xx, yy, wall_break + 1])
visited[yy][xx][0] = True
dist[yy][xx] = dist[y][x] + 1
return -1
print(bfs(0, 0))
'์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
3190 - ๋ฑ [์ฑ๊ณต(๋ฐ๋กํํธ)|02:14:43] (0) | 2024.08.09 |
---|---|
๋ฐฑ์ค 12094 - 2048 (Hard) [ํ์ด์ฌ] (0) | 2022.11.22 |
๋ฐฑ์ค 12100 - 2048 (Easy) [ํ์ด์ฌ] (2) | 2022.11.20 |
๋ฐฑ์ค 1541 - ์์ด๋ฒ๋ฆฐ ์ํธ [์๋ฐ] (1) | 2022.10.31 |
๋ฐฑ์ค 10026 | ์ ๋ก์์ฝ [ํ์ด์ฌ] (0) | 2022.08.09 |