본문 바로가기

알고리즘 풀이/백준

[백준] 7569번: 토마토 - JAVA

🔗 문제 링크

BOJ 7569번: 토마토

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

📝 풀이 과정

[백준] 7576번: 토마토에서 높이만 추가된 문제이다. 높이가 추가되었기 때문에 기존 4방향(앞, 뒤, 왼쪽, 오른쪽) 탐색에서 2방향(위, 아래)도 탐색해야한다.

이 문제에서 헷갈릴 수 있는 부분은 배열 선언 부분인데 기존 tomato[N][M]배열이 높이(H)개 만큼 존재하는 것이므로 tomato[H][N][M]이 되어야 한다!

 

💻 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] dy = { 0, 0, -1, 1, 0, 0 };
        int[] dx = { 0, 0, 0, 0, -1, 1 };
        int[] dz = { -1, 1, 0, 0, 0, 0 };
        int M = sc.nextInt(), N = sc.nextInt(), H = sc.nextInt();

        int[][][] tomato = new int[H][N][M];
        int cnt = 0, days = 0;
        Queue<int[]> que = new LinkedList<>();

        for (int h = 0; h < H; h++) {
            for (int n = 0; n < N; n++)
                for (int m = 0; m < M; m++) {
                    tomato[h][n][m] = sc.nextInt();
                    if (tomato[h][n][m] == 1)
                        que.add(new int[] { h, n, m });
                    else if (tomato[h][n][m] == 0)
                        cnt++;
                }
        }

        while (cnt > 0 && !que.isEmpty()) {
            for (int s = que.size(); s > 0; s--) {
                int[] cur = que.poll();

                for (int k = 0; k < 6; k++) {
                    int nz = cur[0] + dz[k];
                    int ny = cur[1] + dy[k];
                    int nx = cur[2] + dx[k];

                    if (ny < 0 || nx < 0 || nz < 0 || ny >= N || nx >= M || nz >= H || tomato[nz][ny][nx] != 0)
                        continue;

                    cnt--;
                    tomato[nz][ny][nx] = 1;
                    que.add(new int[] { nz, ny, nx });
                }
            }
            days++;
        }
        System.out.println(cnt == 0 ? days : -1);

    }
}

 

📊 제출 결과