접근

바로 전 토마토 문제와 유사하고, 풀이 방법도 유사하다. 참고하여 풀면 될 것 같다.

다만 기존 코드에 높이 변수만 추가하여 작성했더니 Python에서 시간초과, PyPy3에서 시간안에 풀어주었다.

while q: 부분을 bfs 함수로 만들어주었더니 간신히 Python에서도 시간안에 통과하였다.

BFS 유사 문제 참조: 2021.04.11 - [코딩/백준 (Python)] - 백준 7576번: 토마토 (Python)

 

백준 7576번: 토마토 (Python)

접근 문제 자체는 간단한 BFS 문제였으나, 날짜를 입력하는 새로운 리스트를 만들어서 계산했을 때 시간초과가 나와서 조금 헤메게 되었다. BFS 연관문제 : 2021.04.11 - [코딩/백준 (Python)] - 백준 2178

ca.ramel.be

코드

import sys
from collections import deque

n, m, h = map(int, sys.stdin.readline().split())
tomato = [[list(map(int, sys.stdin.readline().split())) for _ in range(m)] for __ in range(h)]
q = deque([])
for i in range(h):
    for j in range(m):
        for k in range(n):
            if tomato[i][j][k] == 1:
                q.append([i, j, k])
dx = [1, 0, -1, 0, 0, 0]
dy = [0, 1, 0, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]


def bfs():
    while q:
        now = q.popleft()
        for i in range(6):
            nx = now[0] + dx[i]
            ny = now[1] + dy[i]
            nz = now[2] + dz[i]
            if 0 <= nx < h and 0 <= ny < m and 0 <= nz < n and tomato[nx][ny][nz] == 0:
                tomato[nx][ny][nz] = tomato[now[0]][now[1]][now[2]] + 1
                q.append([nx, ny, nz])


bfs()
maximum = 0
all = True
for i in tomato:
    for j in i:
        for k in j:
            if k > maximum:
                maximum = k
            if k == 0:
                all = False
if all:
    print(maximum - 1)
else:
    print(-1)

더 생각해 볼 것?

while q: 부분을 bfs 함수로 넣었을 때 통과할 수 있는 이유는 파이썬에서 전역변수 참조가 지역변수 참조보다 느려서 그렇다고 한다. 아직 이해가 잘은 안되지만 파이썬이 그렇다고 하니.. 받아들이고 이에 대해서도 공부가 필요할 것 같다.

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기