코딩테스트-알고리즘/백준 BOJ

[백준 BOJ/Gold V] 7569번 : 토마토

닉네임생각즁 2024. 2. 23. 23:03

 

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

 

7569번: 토마토

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

www.acmicpc.net

 

 

아래 문제에서 조금 더 발전된 버전이다

https://fruits2lim.tistory.com/entry/%EB%B0%B1%EC%A4%80-BOJGold-V-7576%EB%B2%88-%ED%86%A0%EB%A7%88%ED%86%A0

 

[백준 BOJ/Gold V] 7576번 : 토마토

https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘

fruits2lim.tistory.com

 

7576번은 2차원 배열 7569번은 3차원 배열..!

3차원 배열로 놓고 z축 기준으로도 -1, 1 해준것을 생각해주면 된다

 

 

최종 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {
    static int M; // 상자의 가로 칸의 수, j
    static int N; // 상자의 세로 칸의 수, i
    static int H; // H번 반복(수직으로 쌓이는 상자 개수), k
    static int[][][] box;
    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[]> dq;
    static int answer;

    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());
        box = new int[H][N][M];
        dq = new ArrayDeque<>();

        int count = 0; // 0 있는지 확인하는 용도
        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++) {
                    box[k][i][j] = Integer.parseInt(st.nextToken());
                    if (box[k][i][j] == 1) dq.addLast(new int[] {k, i, j});
                    else if (box[k][i][j] == 0) count++;
                }
            }
        }
        // System.out.println(Arrays.deepToString(box));

        if (count != 0) { // 0이 없으면 계산할 필요가 없음
            bfs();
            answer = answer - 1; // 처음에 2부터 넣었기 때문에 최종 답은 -1 해야함

            loop:
            for (int k = 0; k < H; k++) {
                for (int i = 0; i < N; i++) {
                    for (int j = 0; j < M; j++) {
                        if (box[k][i][j] == 0) {
                            answer = -1;
                            break loop;
                        }
                    }
                }
            }
        }
        System.out.println(answer);
    }

    static void bfs() {
        while (!dq.isEmpty()) {
            int[] zxy = dq.pollFirst();
            int z = zxy[0];
            int x = zxy[1];
            int y = zxy[2];

            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 && nz < H && nx >=0 && nx < N && ny >= 0 && ny < M) {
                    if (box[nz][nx][ny] == 0) {
                        dq.addLast(new int[] {nz, nx, ny});
                        box[nz][nx][ny] = box[z][x][y] + 1;
                    }
                    answer = Math.max(answer, box[nz][nx][ny]);
                }
            }
        }
    }
}