알고리즘

백준 No.7576 토마토 - JAVA

jaewoo 2023. 5. 4. 13:58

문제

철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자 칸에 하나씩 넣어서 창고에 보관한다.

창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들도 익을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지, 그 최수 일수를 알고 싶어한다.

 



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 map[][];
    static int dx[] = {-1,1,0,0};
    static int dy[] = {0,0,-1,1};

    static Queue<Node> queue = new LinkedList<>();
    static int N,M;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());

         N = Integer.parseInt(st.nextToken());
         M = Integer.parseInt(st.nextToken());

        map = new int[M][N];

        for (int i = 0; i < M ; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N ; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());

                if(map[i][j] == 1) queue.add(new Node(i,j)); //익은 부분에서부터 퍼져야 하기 때문에 먼저 Queue로 받는다.
            }
        }

        bfs();

    }

    static void bfs(){
        while (!queue.isEmpty()){
            Node now = queue.poll();

            for (int i = 0; i < 4; i++) {
                int nx = now.x + dx[i];
                int ny = now.y + dy[i];

                if(nx < 0 || ny < 0 || nx >= M || ny >= N) continue;


                if(map[nx][ny] == 0){
                    queue.add(new Node(nx,ny)); 
                    map[nx][ny] = map[now.x][now.y] + 1; //익는데 걸리는 시간
                }
            }
        }

        int solution = Integer.MIN_VALUE;

        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N ; j++) {
                if(map[i][j] == 0) {
                    System.out.println(-1); //다 안 된경우
                    return;
                }

                solution = Math.max(solution,map[i][j]);    //익게 만든 것중 가장 큰것
            }
        }

        if(solution == 1) {
            System.out.println(0);  //다 익어있던 상태여서 기존에 주어진 값을 변경하지 않음
        }
        else {
            System.out.println(solution-1); //제일 큰 값에서 -1을 해줘야함
        }
    }


    static class Node{
        int x;
        int y;

        public Node(int x,int y){
            this.x = x;
            this.y = y;

        }
    }
}