7569번 - 토마토

의혁·2025년 2월 24일
0

[Algorithm] 알고리즘

목록 보기
46/50

💡 3차원 BFS를 익혀보자

import sys
from collections import deque 

input = sys.stdin.readline

M, N, H = map(int,input().rstrip().split(' '))
visited = [[[False] * M for _ in range(N)] for _ in range(H)]
graph = [[list(map(int,input().rstrip().split(' '))) for _ in range(N)] for _ in range(H)]

dq = deque()

# 상하좌우위아래
dx = [0,0,-1,1,0,0]
dy = [1,-1,0,0,0,0]
dz = [0,0,0,0,1,-1]

for i in range(H):
    for j in range(N):
        for k in range(M):
            if graph[i][j][k] == 1 and visited[i][j][k] is False:
                dq.append((k,j,i))
                visited[i][j][k] = True
                
def bfs():
    
    while dq:
        x, y, z = dq.popleft()
        for idx in range(6):
            nx = x + dx[idx]
            ny = y + dy[idx]
            nz = z + dz[idx]
            
            if 0 <= nx < M and 0 <= ny < N and 0 <= nz < H and graph[nz][ny][nx] == 0 and visited[nz][ny][nx] is False:
                dq.append((nx,ny,nz))
                graph[nz][ny][nx] = graph[z][y][x] + 1
                visited[nz][ny][nx] = True

bfs()

day = 0

for q in graph: 
    for p in q:
        if 0 in p:
            print(-1)
            exit()
        else:
            day = max(day, max(p))
            
print(day-1)
  • 위 문제는 앞선 토마토 문제와 거의 동일한 문제이다.
  • 다만 앞선 문제와는 달리 x,y,z까지 고려를 해야한다는 점이다.
  • 풀이방식은 기존 토마토 문제와 아주 동일하다. 제일 먼저 익은 토마토를 dq안에 넣고 확장해가는 동일한 방식을 사용하였다.
  • 다만 조금의 차이점이라면, 기존 2차원과 다르게 3차원이다보니 ,dx,dy,dz까지 필요하다는 점이였고, 각 요소의 갯수가 6개가 된다는 점이였더.
  • 그 외에 추가적으로, 한줄 코딩을 이용해서 for문 3개를 이용한 입력값 받기를 한줄로 선언했다.
graph = [[list(map(int,input().rstrip().split(' '))) for _ in range(N)] for _ in range(H)]
profile
매일매일 차근차근 나아가보는 개발일기

0개의 댓글