상세 컨텐츠

본문 제목

[BOJ / 백준 7569번][PYTHON] 토마토 - (BFS, 3차원 배열)

알고리즘, 자료구조

by grizzly 2025. 2. 5. 15:23

본문

어우 길다

이전 포스팅했던 토마토 문제와 맥락은 똑같다. 상자에 토마토가 없는 칸이 있을 수 있으며 인접한 곳에 영향을 준다. 살짝의 차이는 위 아래가 추가 되었다. 

 

구현은 아래와 같다.

from collections import deque
nx = [-1,1,0,0,0,0]
ny = [0,0,-1,1,0,0]
nh = [0,0,0,0,1,-1] # nx와 ny가 움직임이 0일때 위아래로 움직일 수 있음.

q = deque([])
m,n,h = map(int, input().split())
arr = [[] for _ in range(h)]

for i in range (h):
    for j in range(n):
        tmp = list(map(int,input().split()))
        arr[i].append(tmp)

for i in range(h):
    for j in range(n):
        for k in range(m):
            if arr[i][j][k] == 1:
                q.append([i,j,k])
def bfs():
    while q:
        h1,y1,x1 = q.popleft()
        for tmp in range(6):
            dx = nx[tmp] + x1
            dy = ny[tmp] + y1
            dh = nh[tmp] + h1
            
            if 0<=dx<m and 0<=dy<n and 0<=dh<h and arr[dh][dy][dx] == 0:
                arr[dh][dy][dx] = arr[h1][y1][x1] + 1
                q.append([dh,dy,dx])

bfs()
count = 0
flag = True
for i in range(h):
    for j in range(n):
        for k in arr[i][j]:
            if k == 0:
                flag = False
                break
            count = max(k,count)

if flag == False:
    print(-1)
else:
    print(count-1)

 

문제를 풀면서 살짝 꼬였던 것은 실수로 움직일 수 있는 배열의 크기를 5로 만들어서 정보가 하나가 빠졌었다. 이거를 발견하지 못해서 계산이 갱신된 값을 보면서 의문만을 가져었다. 

관련글 더보기