[백준 7469] 토마토

like0·2022년 8월 19일
0

코테준비(JAVA)

목록 보기
21/37

생각 정리

삼차원 배열 사용
익은 토마토가 여러개일 수 있음 => queue에 한번에 넣기 , 방문 표시
저장될 때부터 모든 토마토가 익어있는 상태라면 0을 출력해야 한다.
bfs 시작하기
배열 길이를 벗어나거나,
이미 방문했거나,
토마토가 들어있지 않은 칸이라면
=> 탐색된 위치에 있는 토마토들은 익어감

bfs를 한번 했는데 0인 토마토가 남아있다면 모두 익지 못하는 상황이다. ( -1 출력)

코드

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

public class Main {

    static int H, N, M;
    static boolean[][][] visited;
    static int[][][] tomatos;
    static int[][][] dist;
    static int days = 0;
    static Queue<Position2> q = new LinkedList<>();

    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()); 


        visited = new boolean[H][N][M];
        tomatos = new int[H][N][M];
        dist = new int[H][N][M];
        boolean flag = true;
        boolean complete = true;

        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++) {
                    tomatos[i][j][k] = Integer.parseInt(st.nextToken());  //  정수 1은 익은 토마토, 정수 0 은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않은 칸

                    if(tomatos[i][j][k] == 0) 
                        flag = false; //익지 않은 것이 하나라도 있음
                    if(tomatos[i][j][k] == 1){
                        q.add(new Position2(i, j, k)); 
                        visited[i][j][k] = true;
                    }
                }
            }
        }
        
        // if(flag)
        //     return 0; //처음부터 다 익어있음 

        int count = 0;
        for(int i=0; i< H; i++) {
            for(int j=0; j< N; j++) {
                for(int k=0; k<M; k++) {
                    if(tomatos[i][j][k] == 1){
                        bfs(i, j, k); 
                    }
                }
            }
        }

        for(int i=0; i< H; i++) {
            for(int j=0; j< N; j++) {
                for(int k=0; k<M; k++) {
                    if(tomatos[i][j][k] == 0) {
                        complete = false;
                    }
                        
                }
            }
        }

        //System.out.println(count + " ==================== ");
        if(flag)
            System.out.println(0);
        else if(!complete)
            System.out.println(-1);
        else{

            System.out.println(days);
        }
        //return count;
    }

    static void bfs(int h, int x, int y) {
        int[] dh = {0, 0, 0, 0, 1, -1};
        int[] dx = {-1, 0, 1, 0, 0, 0};
        int[] dy = {0, -1, 0, 1, 0, 0};
        
        while(!q.isEmpty()) {
            Position2 out = q.poll();

            for(int i=0; i<6; i++) {
                int nh = out.h + dh[i];
                int nx = out.x + dx[i];
                int ny = out.y + dy[i];

                if(nh< 0 || nx< 0 || ny< 0 || nh >= H || nx>= N || ny >= M ) continue;
                else if( visited[nh][nx][ny] || tomatos[nh][nx][ny] == -1 ) continue;
                else {
                    visited[nh][nx][ny] = true;
                    tomatos[nh][nx][ny]  = 1;
                    q.add(new Position2(nh, nx, ny));
                    dist[nh][nx][ny]  = dist[out.h][out.x][out.y] + 1;
                    days = dist[nh][nx][ny] ;
                }
            }

        }
    }
    
}

class Position2{

    int h;
    int x;
    int y;
    
    Position2(int h, int x, int y) {

        this.h = h;
        this.x = x;
        this.y = y;
    }
}
profile
배우고 성장하는 개발자가 되기!

0개의 댓글