728x90

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.InputStreamReader;
import java.util.*;

public class Main_BJ_7569_토마토 {
    static int box[][][];
    static int m, n, h;
    static boolean visited[][][];
    static Deque<int []> q = new ArrayDeque<>();
    // 상 하 좌 우 위 아래
    static int[] dx = {-1, 1, 0, 0, 0, 0};
    static int[] dy = {0, 0, -1, 1, 0, 0};
    static int[] dh = {0, 0, 0, 0, -1, 1};
    static int cnt = 0;
    public static void main(String[] args) throws Exception{
        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[m][n][h];
        visited = new boolean[m][n][h];

        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[k][j][i] = Integer.parseInt(st.nextToken());
                    if(box[k][j][i] == 1){
                        visited[k][j][i] = true;
                        q.add(new int[] {k, j, i});
                    }
                }
            }
        }

        bfs();
        for(int i=0; i<h; i++){
            for(int j=0; j<n; j++){
                for(int k=0; k<m; k++){
                    if(box[k][j][i] == 0) {
                        System.out.println(-1);
                        System.exit(0);
                    }
                }
            }
        }
        System.out.println(cnt-1);
    }
    public static void bfs(){
        while(!q.isEmpty()){
            int temp = q.size();
            for(int c=0; c<temp; c++) {
                int[] arr = q.poll();
                for (int i = 0; i < 6; i++) {
                    int nx = arr[0] + dx[i];
                    int ny = arr[1] + dy[i];
                    int nh = arr[2] + dh[i];

                    if (check(nx, ny, nh) && box[nx][ny][nh] == 0 && !visited[nx][ny][nh]) {
                        q.offer(new int[]{nx, ny, nh});
                        box[nx][ny][nh] = 1;
                        visited[nx][ny][nh] = true;
                    }
                }
            }
            cnt++;
        }//while
    }//bfs
    public static boolean check(int x, int y, int z){
        if(x<0 || x>=m || y<0 || y>=n || z<0 || z>=h )
            return false;
        return true;
    }
}

이와 비슷한 문제가 그냥 2차원 배열로 있던것 같은데,,, 기억이 안난다.

아마 standard로 적혀있던것 같음

 

별다른건 없고, 주변 토마토가 익어야 하므로 먼저 익은 토마토를 큐에 담아둔다.

그리고 bfs로 주변 토마토를 익게 하고, 익은 토마토를 큐에 다시 담으면 된다.

 

이때, 각 날짜별로 토마토를 모두 담은 후 토마토 개수를 센다. => 이것을 이용해서 날짜를 구분한다!

하지만, 무조건 처음에 모두 익었다면 0로 출력하라고 했으므로, -1을 하여 출력한다.

 

bfs를 2차원에서 3차원까지 확장하여 탐색할 수 있는지의 문제였다!

728x90

'코테 > 백준' 카테고리의 다른 글

백준 5430 AC(JAVA)  (0) 2023.01.12
백준 11047 동전0 (JAVA)  (0) 2023.01.11
백준 2920 음계(JAVA)  (1) 2023.01.09
백준 17070 파이프 옮기기 1(JAVA)  (1) 2022.09.30
백준 1158 요세푸스 문제(JAVA)  (0) 2022.08.19

+ Recent posts