본문 바로가기

코딩/코테대비

[Baekjoon] 7569번 토마토 / Python

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

내가 생각한 풀이과정

- 기존 백준 7576번의 토마토 풀이 과정에서 높이만 추가해줬음

- BFS로 접근 (dx, dy, dh까지 6개의 방향을 고려)

 

생각해야할 사항

- 3중 for문을 탈출할 수 있는 exit()를 사용해보고 싶었음

   - 결과적으로는 실패함(이유를 모르겠음)

 

import sys

n, m, h = map(int, sys.stdin.readline().split())
farm = []
tomato = []

for i in range(h) :
    tmp = []
    for j in range(m) :
        tmp.append(list(map(int, sys.stdin.readline().split())))
        for k in range(n) :
            if tmp[j][k] == 1 :
                tomato.append((i, j, k))
    farm.append(tmp)

dx = [1, -1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dh = [0, 0, 0, 0, 1, -1]

from collections import deque

q = deque(tomato)
while q :
    hei, row, col = q.popleft()
    for i in range(6) :
        nh = hei + dh[i]
        nx = row + dx[i]
        ny = col + dy[i]
        if nh >= 0 and nh < h and nx >= 0 and nx < m and ny >= 0 and ny < n :
            if farm[nh][nx][ny] == 0:
                q.append((nh, nx, ny))
                farm[nh][nx][ny] = farm[hei][row][col] + 1

max_val = -2

for i in range(h) :
    for j in range(m) :
        for k in range(n) :
            if farm[i][j][k] == 0 :
                max_val = None
                break
            max_val = max(max_val, farm[i][j][k])
        if max_val == None :
            break
    if max_val == None :
        break

if max_val == None :
    print(-1)
else :
    print(max_val - 1)