본문 바로가기

코딩테스트/JAVA

[백준 JAVA] 7569번: 토마토

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

 

예전에 풀었던 토마토문제와 아주 유사한 문제 3차원 배열을 사용해야하는것 말고는 크게 다른점을 느끼지 못했고 bfs를 이용하여 문제를 풀이했다.

import java.io.*;
import java.util.*;

public class Main {
    public static int N, M, H, zero = 0, ans = 0;
    public static int[][][] map;
    public static Queue<int[]> q = new LinkedList<>();
    public static int[] dr = {0, 0, -1, 0, 1, 0};
    public static int[] dc = {0, 0, 0, 1, 0, -1};
    public static int[] dh = {-1, 1, 0, 0, 0, 0};
    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());

        map = new int[N][M][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++){
                    map[j][k][i] = Integer.parseInt(st.nextToken());
                    if(map[j][k][i] == 0) zero++;
                    else if(map[j][k][i] == 1) q.offer(new int[] {j, k, i});
                }
            }
        }

        bfs();
    }
    public static void bfs() {
        while(!q.isEmpty()){
            int size = q.size();
            for(int i = 0; i < size; i++){
                int[] cur = q.poll();
                for(int d = 0; d < 6; d++){
                    int nr = cur[0] + dr[d];
                    int nc = cur[1] + dc[d];
                    int nh = cur[2] + dh[d];
                    if(nr < 0 || nr >= N || nc < 0 || nc >= M || nh < 0 || nh >= H || map[nr][nc][nh] != 0) continue;
                    map[nr][nc][nh] = 1;
                    zero--;
                    q.offer(new int[] {nr, nc, nh});
                }
            }
            ans++;
        }

        if(zero == 0) System.out.println(ans - 1);
        else System.out.println(-1);
    }
}

 

마지막에 들어와 1이 된 토마토까지 탐색을하기 때문에 zero를 감지해서 while 문을 바로 빠져나오거나 ans 에  1을 빼주면 된다.

 

풀어본 문제라 크게 어렵진 않았고 풀이시간은 15분정도 걸렸다.