업데이트:

카테고리: ,

1. 문제

문제는 링크를 들어가면 볼 수 있다.

2. 정답 코드

문제의 내 정답 코드는 다음과 같다.

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

M,N,H = map(int,read().split())

graph = [[[] for _ in range(N)] for _ in range(H)] # 제일 바깥부터 순서대로 H,N,N이다

# 모든 칸에서 토마토가 존재하는지 확인하고 우선적으로 QUEUE에 넣어야한다.
q = deque()
for h in range(H):
    for n in range(N):
        graph[h][n] = list(map(int,read().split()))
        tomato_temp = [i for i,tomato in enumerate(graph[h][n]) if tomato == 1]
        if len(tomato_temp) >= 1 : # 토마토가 있다면 queue에 정보를 넣자
            for t in tomato_temp :
                q.append([h,n,t])

# 움직임 설정
# 상 하 좌 우 위 아래
dx = [0,0,-1,1,0,0]
dy = [-1,1,0,0,0,0]
dh = [0,0,0,0,1,-1]

days = 0
while q :
    # 하루에 영향을 끼칠 수 있는 토마토는 전부 영향을 끼쳐야하므로
    # for문을 넣어서 전부 사용되게끔 유도
    for i in range(len(q)):
        now_tomato = q.popleft()
        # 6가지 행동을 파악
        for j in range(6):
            nh = now_tomato[0] + dh[j]
            ny = now_tomato[1] + dy[j]
            nx = now_tomato[2] + dx[j]
            # 상자의 정상 범주 안에 있어야하는 조건 하에 진행
            if 0<=nx<M and 0<=ny<N and 0<=nh<H :
                # 주변의 토마토가 있다면(0) 그것을 익었다고 처리하고(1)
                # queue에 넣자
                if graph[nh][ny][nx] == 0 :
                    graph[nh][ny][nx] = 1
                    q.append([nh,ny,nx])

    days += 1

zero_count = 0
for h in range(H):
    for n in range(N):
        zero_count += graph[h][n].count(0)
if zero_count == 0 :
    print(days-1)
else :
    print(-1)





3. 문제 풀이

이 문제는 토마토문제 에서 좀더 업그레이된 버전이지만, 사실 쉽다. BFS를 다룰줄만 알면 무난히 풀 수 있는 문제. 따라서 딱히 설명할 것은 없지만, 리스트 안에 해당 요소가 있는지 파악하기 위해 이번에 새로 쓴 문법이 있는데, 그것은 다음과 같다.

tomato_temp = [i for i,t in graph[h][n] if t == 0]

앞으로도 자주 쓸 것 같으니 잘 파악해두자.

1 분 소요