암흑 군주 이민혁 마법 구술을 얻어 티떱 숲에 홍수를 일으킬 것이다.
숲에는 고슴도치 한마리 살고 있다.
고슴도치는 친구 비버의 굴로 가능한 빨리 도망가 홍수를 피하고자 한다.
숲의 지도는 R행 C열이고
매 분마다 고슴도치는 현재 있는 칸과 인접한 네 칸 중 하나로 이동(위, 아래, 오른쪽, 왼쪽)
물도 매분마다 비어있는 칸으로 확장한다
물이 있는 칸과 인접해있는 비어있는 칸(적어도 한 변을 공유)은 물이 차게 된다.
물과 고슴도치는 돌을 통과할 수 없다.
고슴도치는 물로 차있는 구역으로 이동할 수 없고, 물도 비버의 소굴로 이동할 수 없다
고슴도치는 물이 찰 예정인 칸으로 이동할 수 없다. 아동할 수 있으면 고슴도치가 물에 빠지기 때문이다.
티떱숲의 지도가 주어졌을 때, 고슴도치가 안전하게 비버의 굴로 이동하기 위해 필요한 최소 시간을 구하시오
고슴도치는 물이 찰 예정인 칸으로 이동할 수 없다.
라는 조건을 처리하기 어려웠다.queue
에 고슴도치의 위치 정보를 제일 먼저 탐색할 수 있게 .appendleft()
했고 물의 위치 정보는 그 뒤에 .append()
해서 처리했다.import sys
from collections import deque
input = sys.stdin.readline
r, c = map(int, input().split())
# forest = []
# for _ in range(r):
# forest.append(list(input().strip()))
forest = [list(input().strip()) for _ in range(r)]
time = [[0]* c for _ in range(r)]
queue = deque()
# 고슴도치위치 (S), 물의 위치 (S) 큐에 넣고
# 비버 굴(D) 위치 target에 저장
for row in range(r):
for col in range(c):
if forest[row][col] == "S":
queue.appendleft((row, col))
elif forest[row][col] == "*":
queue.append((row, col))
elif forest[row][col] == 'D':
target = (row, col)
# 2차원 리스트 상하좌우 이동을 위한 direction 변수
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def bfs(target):
while queue:
x, y = queue.popleft()
# target인 비버굴에 도착했을 경우 걸린 시간을 반환
if forest[target[0]][target[1]] == "S":
return(time[target[0]][target[1]])
# 상하좌우로 이동
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
# 숲의 범위 내에서
if 0 <= nx < r and 0 <= ny < c:
# 도치일 경우
# 이동할 곳이 비어있거나 비버굴이라면 도치의 위치를 이동한뒤 큐에 넣고, 걸린 시간 +1 해준다.
if forest[x][y] == "S" and (forest[nx][ny] == '.' or forest[nx][ny] == 'D'):
forest[nx][ny] = "S"
queue.append((nx, ny))
time[nx][ny] = time[x][y] + 1
# 물일 경우
# 이동할 곳이 비어있거나 도치가 있다면 물의 위치를 이동한뒤 큐에 넣고, 걸린 시간 +1 해준다.
elif forest[x][y] == "*" and (forest[nx][ny] == "." or forest[nx][ny] == "S"):
forest[nx][ny] = "*"
queue.append((nx, ny))
return "KAKTUS"
print(bfs(target))
forest = [list(input().strip()) for _ in range(r)]
forest = []
for _ in range(r):
forest.append(list(input().strip()))