Algorithm Solving/Java

[BOJ] 백준 7569번 : 토마토 - Java

기만나🐸 2024. 12. 29. 22:17

https://www.acmicpc.net/problem/7569

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

public class Main {

    static int M; // 상자의 가로 칸 수 (가로)
    static int N; // 상자의 세로 칸 수 (세로)
    static int H; // 쌓아 올려지는 상자의 수 (높이)

    static int[][][] arr;
    static boolean[][][] visited;
    static Queue<int[]> queue = new LinkedList<>();

    // 방향
    static int[] dh = { -1, 1, 0, 0, 0, 0 }; // 위아래
    static int[] dn = { 0, 0, -1, 1, 0, 0 }; // 앞뒤
    static int[] dm = { 0, 0, 0, 0, -1, 1 }; // 좌우

    static int cnt = -1;

    public static void main(String[] args) throws IOException {
        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());

        arr = new int[H][N][M];
        visited = new boolean[H][N][M];

        for (int h = 0; h < H; h++) {
            for (int n = 0; n < N; n++) {
                st = new StringTokenizer(br.readLine(), " ");
                for (int m = 0; m < M; m++) {
                    int tomato = Integer.parseInt(st.nextToken());
                    if (tomato == 1) {
                        queue.offer(new int[] { h, n, m });
                        visited[h][n][m] = true;
                    }
                    arr[h][n][m] = tomato;
                }
            }
        }

        // 모든 토마토가 익어 있는 상태 확인
        boolean allRipe = true;
        for (int h = 0; h < H; h++) {
            for (int n = 0; n < N; n++) {
                for (int m = 0; m < M; m++) {
                    if (arr[h][n][m] == 0) {
                        allRipe = false;
                    }
                }
            }
        }
        if (allRipe) {
            System.out.println(0);
            return;
        }

        bfs();

        // BFS 종료 후, 익지 않은 토마토가 있는지 확인
        for (int h = 0; h < H; h++) {
            for (int n = 0; n < N; n++) {
                for (int m = 0; m < M; m++) {
                    if (arr[h][n][m] == 0) {
                        System.out.println(-1);
                        return;
                    }
                }
            }
        }

        System.out.println(cnt);
    }

    public static void bfs() {
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                int[] currentTomato = queue.poll();
                int currentTomatoH = currentTomato[0];
                int currentTomatoN = currentTomato[1];
                int currentTomatoM = currentTomato[2];

                // 6방향 탐색
                for (int j = 0; j < 6; j++) {
                    int nextH = currentTomatoH + dh[j];
                    int nextN = currentTomatoN + dn[j];
                    int nextM = currentTomatoM + dm[j];

                    if (nextH >= 0 && nextH < H && nextN >= 0 && nextN < N && nextM >= 0 && nextM < M) {
                        if (!visited[nextH][nextN][nextM] && arr[nextH][nextN][nextM] == 0) {
                            visited[nextH][nextN][nextM] = true;
                            arr[nextH][nextN][nextM] = 1;
                            queue.offer(new int[] { nextH, nextN, nextM });
                        }
                    }
                }
            }
            cnt++; // 하루 경과
        }
    }
}