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

2024. 12. 29. 22:17·Algorithm Solving/Java

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++; // 하루 경과
        }
    }
}
저작자표시 비영리 변경금지 (새창열림)

'Algorithm Solving > Java' 카테고리의 다른 글

[BOJ] 백준 2468번 : 안전 영역 - Java  (1) 2024.12.30
[BOJ] 백준 7562번 : 나이트의 이동 - Java  (0) 2024.12.30
[BOJ] 백준 1697번 : 숨바꼭질 - Java  (1) 2024.12.26
[BOJ] 백준 10828번 : 스택 - Java  (0) 2024.12.26
[BOJ] 백준 1929번 : 소수 구하기 - Java  (1) 2024.12.23
'Algorithm Solving/Java' 카테고리의 다른 글
  • [BOJ] 백준 2468번 : 안전 영역 - Java
  • [BOJ] 백준 7562번 : 나이트의 이동 - Java
  • [BOJ] 백준 1697번 : 숨바꼭질 - Java
  • [BOJ] 백준 10828번 : 스택 - Java
기만나🐸
기만나🐸
공부한 내용을 기록합시다 🔥🔥🔥
  • 기만나🐸
    기만나의 공부 기록 🤓
    기만나🐸
  • 전체
    오늘
    어제
    • ALL (147)
      • TIL (Today I Learned) (56)
      • Dev Projects (15)
      • Algorithm Solving (67)
        • Java (52)
        • SQL (15)
      • Certifications (8)
        • 정보처리기사 실기 (8)
  • 인기 글

  • 태그

    자료구조
    다이나믹프로그래밍
    BFS
    DFS
    dp
    Google Fonts
    javascript
    Firebase
    jpa
    BOJ
    java
    mysql
    CSS
    greedy
    완전탐색
    GROUP BY
    bootstrap
    programmers
    프로그래머스
    백준
    시뮬레이션
    그리디
    HTML
    sql
    백트래킹
    Subquery
    jQuery
    join
    websocket
    jwt
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
기만나🐸
[BOJ] 백준 7569번 : 토마토 - Java
상단으로

티스토리툴바