728x90

문제

https://www.acmicpc.net/problem/2206

 

2206번: 벽 부수고 이동하기

N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로

www.acmicpc.net

 

풀이

visited는 앞서 방문한 위치를 체크하여 재방문하지 않도록 하고, 경로 및 이동 거리를 저장합니다.

visited를 벽 부수기 전후로 나누어 체크합니다.

  • visited[x][y][0] : 벽 부수기 전 경로
  • visited[x][y][1] : 벽 부수기 후 경로

이동할 위치의 이동 거리를 현재 위치의 이동 거리에 1을 더해 구합니다.

 

코드

파이썬
import sys
from collections import deque

input = sys.stdin.readline

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

N, M = map(int, input().split())
board = [list(map(int, list(input().rstrip()))) for _ in range(N)]


def BFS():
    queue = deque()
    visited = [[[0] * 2 for _ in range(M)] for _ in range(N)]
    visited[0][0][False] = 1
    queue.append((0, 0, False))
    while queue:
        x, y, c = queue.popleft()
        if (x, y) == (N - 1, M - 1):
            return visited[x][y][c]
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < N and 0 <= ny < M:
                if board[nx][ny] == 0 and not visited[nx][ny][c]:
                    visited[nx][ny][c] = visited[x][y][c] + 1
                    queue.append((nx, ny, c))
                elif board[nx][ny] == 1 and not c:
                    visited[nx][ny][True] = visited[x][y][c] + 1
                    queue.append((nx, ny, True))
    return -1


print(BFS())
728x90

'🚩 코딩테스트 > 알고리즘' 카테고리의 다른 글

[백준] 1967번: 트리의 지름  (1) 2023.05.15
[백준] 16236번: 아기 상어  (0) 2023.05.13
[백준] 1987번: 알파벳  (0) 2023.05.11
[백준] 7569번: 토마토  (0) 2023.05.11
[백준] 10026번: 적록색약  (0) 2023.05.11
딩딩크롱