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 |
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 |