티스토리 뷰
https://www.acmicpc.net/problem/2206
2206번: 벽 부수고 이동하기
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로
www.acmicpc.net
문제의 핵심은 방문 여부를 체크하는 visited을 3중 배열로 만들어야 한다는 것이다.
그래야 벽을 부순 횟수의 파악이 수월하다.
나도 이 아이디어를 생각해내는 데 많은 시간이 걸렸다. ㅠㅠ
최단경로로 가는 길에 벽이 있다면 단 한 번만 부시고 계속 이동하면 된다.
더 자세한 풀이는 주석을 참고하면 된다.
import sys
input = sys.stdin.readline
from collections import deque
N, M = map(int, input().split())
graph = [list(map(int ,input().rstrip()))for _ in range(N)]
visited = [[[0] * 2 for _ in range(M)] for _ in range(N)]
dx = [0,0,-1,1]
dy = [-1,1,0,0]
ans = 0
def bfs():
queue = deque()
visited[0][0][0] = 1
queue.append((0,0,0))
while queue:
a, b, wall = queue.popleft()
if (a, b) == (N-1, M-1):
print(visited[a][b][wall])
return
for i in range(4):
nx = a + dx[i]
ny = b + dy[i]
if 0 <= nx < N and 0 <= ny < M and visited[nx][ny][wall] == 0:
#벽이 아니라면 이동하고, 이전 경로 + 1 visited배열에 저장
if graph[nx][ny] == 0:
queue.append((nx, ny, wall))
visited[nx][ny][wall] = visited[a][b][wall] + 1
# 벽 1번도 안 부쉈고 다음 이동할 곳이 벼깅라면
if wall == 0 and graph[nx][ny] == 1:
# 벽을 부순 상태를 1로 표현
queue.append((nx, ny, 1))
#벽 부순 상태의 visited[nx][ny][1]에 이전 경로 + 1 저장
visited[nx][ny][1] = visited[a][b][wall] + 1
print(-1)
return
bfs()'Algorithm > BOJ' 카테고리의 다른 글
| [BOJ][Python] 백준 1270번 : 전쟁 - 땅따먹기 (1) | 2023.03.09 |
|---|---|
| [BOJ][Python] 백준 27211번 : 도넛 행성 (0) | 2023.01.26 |
| [BOJ 백준] 17141번 : 연구소 2 (2) | 2023.01.05 |
| [BOJ 백준] 18405번 : 경쟁적 전염 (1) | 2023.01.05 |
| [BOJ 백준] 14940번 : 쉬운 최단거리 (0) | 2023.01.05 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- opgg #클론코딩 #할수있다
- 목데이터
- 리액트
- 보정평균
- 14938
- 마법사 상어
- BOJ
- 도넛 행성
- 알고리즘
- Python
- 데이크스트라
- 서강그라운드
- 최근검색 기능
- BFS
- WOFF2
- 백준 10026
- 파이썬
- 구현
- 리액트 최근검색
- 레벨 2
- 6986
- 리코쳇 로봇
- 리액트 츨겨찾기
- 백준
- boj 2589
- boj 10026 python
- 폰트 최적화
- 1270
- 실버3
- 21610
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
글 보관함