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)
'코딩 > 코테대비' 카테고리의 다른 글
| [Baekjoon] 1520번 내리막 길 / Python (0) | 2022.01.25 |
|---|---|
| [Baekjoon] 15686번 치킨배달 / Python (0) | 2022.01.11 |
| [Programmers] 광고 삽입(Level 3) / Python (0) | 2021.12.28 |