https://www.acmicpc.net/problem/7569
Solution
https://claude-u.tistory.com/272와 같은 방법으로 풀 수 있다.
그러나 앞,뒤,좌,우,위,아래 총 6군데를 체크해주는 방식으로 간다.
아울러 모두 -1일 경우도 걸러준다.
Python Code
import copy
from collections import deque
M, N, H = map(int, input().split())
box = [[[]for _ in range(N)] for _ in range(H)]
for h in range(H):
for n in range(N):
box[h][n]=list(map(int, input().split()))
ripen_box = copy.deepcopy(box) #인풋을 수정하기 싫어서 복사해준다
#3차원 queue에 넣어준다. 순서는 인풋 순서대로
queue = deque()
for m in range(M):
for n in range(N):
for h in range(H):
if box[h][n][m] == 1:
queue.append([h, n, m])
#BFS를 3차원으로 바꿔준다
while queue:
[h, n, m] = queue.popleft()
#앞
if m > 0 and ripen_box[h][n][m-1] == 0:
queue.append([h, n, m-1])
ripen_box[h][n][m-1] = ripen_box[h][n][m] + 1
#뒤
if m < M-1 and ripen_box[h][n][m+1] == 0:
queue.append([h, n, m+1])
ripen_box[h][n][m+1] = ripen_box[h][n][m] + 1
#왼쪽
if n > 0 and ripen_box[h][n-1][m] == 0:
queue.append([h, n-1, m])
ripen_box[h][n-1][m] = ripen_box[h][n][m] + 1
#오른쪽
if n < N-1 and ripen_box[h][n+1][m] == 0:
queue.append([h, n+1, m])
ripen_box[h][n+1][m] = ripen_box[h][n][m] + 1
#위
if h > 0 and ripen_box[h-1][n][m] == 0:
queue.append([h-1, n, m])
ripen_box[h-1][n][m] = ripen_box[h][n][m] + 1
#아래
if h < H-1 and ripen_box[h+1][n][m] == 0:
queue.append([h+1, n, m])
ripen_box[h+1][n][m] = ripen_box[h][n][m] + 1
#0이 있을 경우, -1만 있을 경우 제거
answer = True
minus_count = N*M*H
for height in ripen_box:
for row in height:
if 0 in row:
answer = False
minus_count -= row.count(-1)
if answer and minus_count:
min_day = 1
for height in ripen_box:
for row in height:
min_day = max(min_day, max(row))
print(min_day-1)
else:
print(-1)
'Programming [Python] > 백준 알고리즘 솔루션' 카테고리의 다른 글
#224 백준 파이썬 [5585] 거스름돈 (0) | 2019.11.29 |
---|---|
#223 백준 파이썬 [1697] 숨바꼭질 - BFS (0) | 2019.11.28 |
#221 백준 파이썬 [7576] 토마토 - BFS (0) | 2019.11.28 |
#220 백준 파이썬 [11049] 행렬 곱셈 순서 (1) | 2019.11.27 |
#219 백준 파이썬 [1780] 종이의 개수 - 분할정복 (0) | 2019.11.22 |