[PY] 3055 : 탈출

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

이 문제에 대한 아이디어에 대해 생각이 많았지만 내가 실시간으로 움직이기엔 구현 난이도가 좀 버거웠다. 따라서
물에 대한 내용을 수행하여 비버 이동에 대한 기본 틀을 마련한 다음, 그 이후에나 비버 이동에 영향을 미치도록 해서 상당히 가독성 있게 해결 해낸 케이스이다.

끝 판에 메모리 초과 이슈로 파일럿 코의 도움을 다소 받았다.

 

 

import sys
from collections import deque
input = sys.stdin.readline

fieldX, fieldY = map(int, input().split())
fieldStatus = [[] for _ in range(fieldX)]
waterStatus = [[-1] * fieldY for _ in range(fieldX)]
playerStatus = [[-1] * fieldY for _ in range(fieldX)]
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

for i in range(fieldX):
    inputField = input().strip()
    fieldStatus[i] = list(inputField)

waterStart = []
# 전체 순회를 돌면서 체크한다.
# 물 입장에서
waterQ = deque()
playerQ = deque()
for i in range(fieldX):
    for j in range(fieldY):
        if(fieldStatus[i][j] == '*'):
            waterStatus[i][j] = 0
            waterQ.append((i, j))
        elif(fieldStatus[i][j] == 'S'):
            playerQ.append((i, j))
            playerStatus[i][j] = 0
        elif(fieldStatus[i][j] == 'X'):
            waterStatus[i][j] = float('inf')
            playerStatus[i][j] = float('inf')



while waterQ:
    x, y = waterQ.popleft()
    spreadTime = waterStatus[x][y] + 1
    for i in range(4):
        tmpX = x + dx[i]
        tmpY = y + dy[i]

        if(0 <= tmpX < fieldX and 0 <= tmpY < fieldY):
            if(waterStatus[tmpX][tmpY] == -1 and fieldStatus[tmpX][tmpY] not in ('X', 'D')):
                waterStatus[tmpX][tmpY] = spreadTime
                waterQ.append((tmpX, tmpY))


while playerQ:
    x, y = playerQ.popleft()
    arrival = playerStatus[x][y] + 1
    for i in range(4):
        tmpX = x + dx[i]
        tmpY = y + dy[i]

        if(0 <= tmpX < fieldX and 0 <= tmpY < fieldY):
            if(fieldStatus[tmpX][tmpY] == 'D'):
                print(f"{arrival}")
                exit()

            if playerStatus[tmpX][tmpY] == -1 and (waterStatus[tmpX][tmpY] == -1 or arrival < waterStatus[tmpX][tmpY]):
                playerStatus[tmpX][tmpY] = arrival
                playerQ.append((tmpX, tmpY))

print("KAKTUS")

'문제풀이' 카테고리의 다른 글

[PY] 2252 : 줄 세우기  (0) 2025.04.03
[PY] 2665 : 미로만들기  (0) 2025.04.02
[PY] <!> 1432 : 그래프 수정  (0) 2025.04.02
[PY] 2294 : 동전 2  (1) 2025.04.01
[PY] 18352 : 특정 거리의 도시 찾기  (0) 2025.04.01