백준 7569번(Java)

박은지·2025년 6월 5일
0

백준

목록 보기
82/89
post-thumbnail

import java.io.*;
import java.util.*;

public class Main {
    static int M, N, H;
    static int[][][] graph;
    // x, y, z축 이동을 위한 델타 배열 선언
    static int[] dx = {-1, 1, 0, 0, 0, 0};
    static int[] dy = {0, 0, -1, 1, 0, 0};
    static int[] dz = {0, 0, 0, 0, -1, 1};
    static Deque<int[]> queue = new ArrayDeque<>();
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        M = Integer.parseInt(st.nextToken());
        N = Integer.parseInt(st.nextToken());
        H = Integer.parseInt(st.nextToken());
        graph = new int[H][N][M];
        
        // 처음부터 모든 토마토가 익은 상태인지 체크하기 위한 변수 선언
        boolean alreadyFinished = true;
        
        // 토마토 배열 입력
        for(int k=0; k<H; k++) {
            for(int i=0; i<N; i++) {
                st = new StringTokenizer(br.readLine());
                for(int j=0; j<M; j++) {
                    graph[k][i][j] = Integer.parseInt(st.nextToken());
                    // 만약 익은 토마토라면 큐에 좌표와 일 수 저장
                    if(graph[k][i][j] == 1) {
                        queue.addLast(new int[]{k, i, j, 0});
                    }
                    // 익지 않은 토마토가 한 개라도 있으면 
                    // BFS를 진행할 수 있으므로 flag값 false로 변경
                    if(graph[k][i][j] == 0) {
                        alreadyFinished = false;
                    }
                }
            }
        }
        
        // 입력부터 더이상 익힐게 없으면 0 출력 후 종료
        if(alreadyFinished) {
            System.out.println(0);
            return;
        }
        
        // BFS를 수행하고 반환된 결과값 저장
        int answer = bfs();
        
        // 익지않은 토마토 체크
        // 있다면 정답을 -1로 변경하고 종료
        for (int k = 0; k < H; k++) {
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if (graph[k][i][j] == 0) {
                        answer = -1;
                        break;
                    }
                }
            }
        }
        System.out.println(answer);
    }

    static int bfs() {
        // 익는데 걸린 일 수를 저장하기 위한 변수 선언
        int day = 0;
        while(!queue.isEmpty()) {
            int[] tmp = queue.removeFirst();
            int z = tmp[0];
            int x = tmp[1];
            int y = tmp[2];
            // 익는데 걸린 일 수 저장
            day = tmp[3];
            for (int i = 0; i < 6; i++) {
                int nz = z + dz[i];
                int nx = x + dx[i];
                int ny = y + dy[i];
                // 범위를 벗어나면 다시 연산
                if (nz < 0 || nx < 0 || ny < 0 || nz >= H || nx >= N || ny >= M) {
                    continue;
                }
                // 익지않은 토마토라면 익히고, 해당 토마토 좌표 및 익는데 걸린 일 수 + 1 큐에 저장
                if (graph[nz][nx][ny] == 0) {
                    graph[nz][nx][ny] = 1;
                    queue.addLast(new int[]{nz, nx, ny, day + 1});
                }
            }
        }
        return day;
    }
}
profile
백엔드 개발자가 되고싶은 eunzi😊

0개의 댓글