티스토리 뷰

반응형

문제

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

 

7569번: 토마토

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

www.acmicpc.net

풀이 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {

    static int[] dh = {1, 0, 0, -1, 0, 0};
    static int[] dy = {0, 1, 0, 0, -1, 0};
    static int[] dx = {0, 0, 1, 0, 0, -1};
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int M = Integer.parseInt(st.nextToken()); //상자 가로
        int N = Integer.parseInt(st.nextToken()); //상자 세로
        int H = Integer.parseInt(st.nextToken()); //상자 개수

        int[][][] box = new int[H][N][M]; //토마토 상자
        int[][][] visit = new int[H][N][M]; //방문 표시
        
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < N; j++) {
                st = new StringTokenizer(br.readLine());
                for (int k = 0; k < M; k++) {
                    box[i][j][k] = Integer.parseInt(st.nextToken());
                }
            }
        }

        Queue<int[]> queue = new LinkedList<>();
        
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < M; k++) {
                    //익은 사과가 있으면, 큐에 담고 방문 표시를 한다.
                    if (box[i][j][k] == 1) {
                        queue.offer(new int[]{i, j, k});
                        visit[i][j][k] = 1;
                    }
                }
            }
        }

        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int l = 0; l < size; l++) {
                int[] curPoint = queue.poll();
                int h = curPoint[0];
                int y = curPoint[1];
                int x = curPoint[2];

                for (int m = 0; m < 6; m++) {
                    int nh = h + dh[m];
                    int ny = y + dy[m];
                    int nx = x + dx[m];
                    
                    if (nh < 0 || ny < 0 || nx < 0 || nh >= H || ny >= N || nx >= M) continue;
                    if (box[nh][ny][nx] == 1) continue;
                    if (box[nh][ny][nx] == -1) continue;
                    
                    //다음 좌표가 상자 범위 내이고 아직 방문 전이고 익지 않은 토마토인 경우
                    queue.offer(new int[]{nh, ny, nx}); //큐에 넣는다.
                    box[nh][ny][nx] = 1; //익은 토마토로 바꾼다.
                    visit[nh][ny][nx] = visit[h][y][x] + 1; //방문 표시 및 카운트를 증가시킨다.
                }
            }
        }

        int max = Integer.MIN_VALUE;
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < M; k++) {
                    //익지 않은 토마토가 있는 경우
                    if (box[i][j][k] == 0) {
                        System.out.println(-1);
                        return;
                    }
                    max = Math.max(max, visit[i][j][k]);
                }
            }
        }

        //1부터 시작하므로 1을 빼준다.
        System.out.println(max - 1);
    }
}
반응형
반응형