[백준] 7569번. 토마토 바로가기
아이디어
- 3차원 배열이라 쫄았는데 그냥 삼중 for문 써서 함
- 삼중 for문 break 헷갈린다
(+ 파이썬에서 프로그램을 강제종료하는 메서드 exit()
을 알게 되었다)
시간 복잡도
코드
from collections import deque
import sys
input = sys.stdin.readline
def tomato(q):
while q:
i, r, c, day = q.popleft()
for j in range(2):
ni = i + di[j]
if 0 <= ni < h and box[ni][r][c] == 0:
q.append((ni, r, c, day + 1))
box[ni][r][c] = 1
for d in range(4):
nr = r + dr[d]
nc = c + dc[d]
if 0 <= nr < n and 0 <= nc < m and box[i][nr][nc] == 0:
q.append((i, nr, nc, day + 1))
box[i][nr][nc] = 1
return day
m, n, h = map(int, input().split())
box = []
for _ in range(h):
box.append([list(map(int, input().split())) for _ in range(n)])
q = deque([])
di = [-1, 1]
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
for i in range(h):
for r in range(n):
for c in range(m):
if box[i][r][c] == 1:
q.append((i, r, c, 0))
if not q:
print(-1)
else:
result = tomato(q)
unripe_tomato = 0
for f in range(h):
for idx, line in enumerate(box[f]):
if line.count(0) > 0:
unripe_tomato += 1
break
if unripe_tomato > 0:
print(-1)
else:
print(result)
from collections import deque
import sys
input = sys.stdin.readline
def tomato(q):
while q:
i, r, c, day = q.popleft()
for j in range(2):
ni = i + di[j]
if 0 <= ni < h and box[ni][r][c] == 0:
q.append((ni, r, c, day + 1))
box[ni][r][c] = 1
for d in range(4):
nr = r + dr[d]
nc = c + dc[d]
if 0 <= nr < n and 0 <= nc < m and box[i][nr][nc] == 0:
q.append((i, nr, nc, day + 1))
box[i][nr][nc] = 1
return day
m, n, h = map(int, input().split())
box = []
for _ in range(h):
box.append([list(map(int, input().split())) for _ in range(n)])
q = deque([])
di = [-1, 1]
dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
for i in range(h):
for r in range(n):
for c in range(m):
if box[i][r][c] == 1:
q.append((i, r, c, 0))
if not q:
print(-1)
else:
result = tomato(q)
for f in range(h):
for idx, line in enumerate(box[f]):
if line.count(0) > 0:
print(-1)
exit(0)
else:
print(result)