7569: 토마토

ewillwin·2023년 6월 12일
0

Problem Solving (BOJ)

목록 보기
63/230

  • 최소 며칠이 걸리는 지 -> bfs
  • box에서 처음에 1이었던 좌표를 start 리스트에 넣어둠
  • start에 있던 좌표들을 기준으로 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 방향을 탐색
    -> box[nh][ni][nj] == 0인 경우, box[nh][ni][nj]에 box[h][i][j] + 1을 할당해주고, queue에 해당 좌표를 추가해줌
import sys
from collections import deque

di = [0, 0, -1, 1, 0, 0]
dj = [-1, 1, 0, 0, 0, 0]
dh = [0, 0, 0, 0, -1, 1]

def bfs():
	queue = deque([])
	for _ in range(len(start)):
		queue.append(start[_])

	while queue:
		h, i, j = map(int, queue.popleft())

		for _ in range(6):
			ni = i + di[_]; nj = j + dj[_]; nh = h + dh[_]
			if ni < 0 or nj < 0 or nh < 0 or ni >= N or nj >= M or nh >= H:
				continue
			if box[nh][ni][nj] == 0:
				box[nh][ni][nj] = box[h][i][j] + 1
				queue.append([nh, ni, nj])

M, N, H = map(int, sys.stdin.readline().split())

box = []
for h in range(H):
	tmp = []
	for n in range(N):
		tmp.append(list(map(int, sys.stdin.readline().split())))
	box.append(tmp)

start = []
for h in range(H):
	for i in range(N):
		for j in range(M):
			if box[h][i][j] == 1:
				start.append([h, i, j])

bfs(); date = 0
for h in range(H):
	for i in range(N):
		for j in range(M):
			if box[h][i][j] == 0:
				print(-1); exit()
		date = max(max(box[h][i]), date)
print(date-1)
profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글