코테/BOJ
백준 14442 [벽 부수고 이동하기 2] 파이썬
동 캄
2025. 3. 10. 20:54
반응형
https://www.acmicpc.net/problem/14442
다행히 이전에 풀었던 문제의 풀이법이 떠올라 쉽게 풀었다.
https://dongkam.tistory.com/435
백준 1600 [말이 되고픈 원숭이] 파이썬
https://www.acmicpc.net/problem/1600 막 덤비다가 깨졌다. 처음에는 방문을 고려하지 않고, 원숭이 이동과 말의 이동을 고려하여 처리를 하니 시간초과가 발생하였다. # 백준 1600 말이 되고픈 원숭이impo
dongkam.tistory.com
위 문제와 마찬가지로 3차원 배열을 생성하여, 벽을 부수는 경우와 그렇지 않은 경우에 대하여 경우를 나누어 탐색한다.
import sys
from collections import deque
# 이동 방향 정의 (오른쪽, 왼쪽, 아래, 위)
dr = [0, 0, 1, -1]
dc = [1, -1, 0, 0]
# 입력 처리 (N: 행, M: 열, K: 부술 수 있는 벽 개수)
N, M, K = map(int, sys.stdin.readline().split())
# 맵 정보 입력
field = []
for _ in range(N):
field.append(list(map(int, sys.stdin.readline().rstrip()))) # 문자열을 정수 리스트로 변환하여 저장
# 방문 여부 저장 리스트 (N x M 크기, K+1 개의 벽 부수기 상태를 저장)
visited = [[[0 for _ in range(K+1)] for _ in range(M)] for _ in range(N)]
def search(map, visit):
success_flg = False # 목적지 도착 여부 확인 변수
q = deque() # BFS 탐색을 위한 큐
q.append((0, 0, K)) # 시작 위치 (0,0)에서 K개의 벽을 부술 수 있는 상태
visited[0][0][K] = 1 # 시작 위치 방문 처리 (이동 횟수를 1로 설정)
while q:
r, c, k = q.popleft() # 현재 위치 (r, c)와 남은 벽 부수기 횟수 (k) 가져오기
# 목표 지점 (N-1, M-1)에 도착하면 결과 출력 후 종료
if r == N - 1 and c == M - 1:
success_flg = True
print(visit[r][c][k]) # 현재까지의 이동 거리 출력
break
# 네 방향으로 이동
for i in range(4):
R = r + dr[i]
C = c + dc[i]
# 맵 범위 내에 있을 경우
if 0 <= R < N and 0 <= C < M:
# 벽이 아닌 경우 (0)이고 방문하지 않은 곳이면 이동
if map[R][C] == 0 and visit[R][C][k] == 0:
visit[R][C][k] = visit[r][c][k] + 1 # 이동 거리 갱신
q.append((R, C, k)) # 다음 탐색을 위해 큐에 추가
# 벽 (1)이고, 벽을 부술 수 있는 경우 (k > 0)
if map[R][C] == 1 and k > 0 and visit[R][C][k - 1] == 0:
visit[R][C][k - 1] = visit[r][c][k] + 1 # 벽을 부수고 이동한 거리 갱신
q.append((R, C, k - 1)) # 벽을 부수고 이동한 상태를 큐에 추가
# 목표 지점에 도착하지 못한 경우 -1 출력
if not success_flg:
print(-1)
# 탐색 실행
search(field, visited)
GPT가 깔끔하게 주석을 달아준 코드이다. (주석만 달아줬습니다.)
반응형