article thumbnail image
Published 2023. 6. 11. 23:11

 

처음엔 dfs를 이용해 풀어보려고 했으나 실패했다.

 

bfs를 이용해 익은 토마토가 들어있는(1) 좌표를 q에 넣어주고,

상하좌우에 있는 토마토 중 안익은(0) 토마토가 들어있는 좌표가 있으면 익은 토마토 일수에서 1을 더해준다

즉 depth가 1 깊어질 때마다 1을 추가해 주는 것이다.

이렇게 하면 일수를 계산 가능하다.

 

그 후 countDay메서드를 통해

가장 깊은 depth를 cnt에 담아주고

depth는 1에서 시작했는데 일수는 0에서부터 시작했으니 날짜를 계산할 때는 1을 빼준다.

 

최종적으로

checkTomato메서드를 통해 안익은 토마토가 있으면 -1을 출력하고 

그렇지 않으면 모든 토마토가 있은것이므로 cnt를 출력한다.

 

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

public class Baek_7576 {
    static int[][] box;
    static int cnt;
    static int[] dx = {-1, 0, 0, 1};
    static int[] dy = {0, -1, 1, 0};
    static int N;
    static int M;
    static Queue<int[]> 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());

        box = new int[N][M];

        //1 익토 / 0안익토 / -1없토
        for (int i = 0; i < N; i++) {
            box[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        }
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (box[i][j] == 1) {
                    q.add(new int[]{i,j});
                }
            }
        }
        bfs();
        countDay();
        cnt = checkTomato()?cnt:-1;
        System.out.println(cnt);
    }

    static void bfs() {
        while (!q.isEmpty()){
            int[] t =q.poll();
            int x = t[0];
            int y = t[1];
            change(x,y);
        }
    }
//안익은 토마토가 있으면 false 출력
    static boolean checkTomato() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (box[i][j] == 0) {
                    return false;
                }
            }
        }
        return true;
    }
    static int countDay(){
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                cnt = Math.max(cnt,box[i][j]-1);
                }
            }
        return cnt;
    }

    //상하좌우중 0이 있으면 q에 넣고 depth+1
     static void change(int x, int y) {
            for (int i = 0; i < 4; i++) {
                int a = x + dx[i];
                int b = y + dy[i];
                if (a < 0 || b < 0 || a >= N || b >= M) {
                    continue;
                }
                if (box[a][b] == 0) {
                    box[a][b] = box[x][y] + 1;
                    q.add(new int[]{a, b});
                }
            }
        }
    }

'Algorithm' 카테고리의 다른 글

[백준 1654] 이진탐색  (1) 2024.03.05
[백준1764]HashSet과 ArrayList의 contains() 시간복잡도  (0) 2023.07.01
백준 1041 주사위  (2) 2023.05.04
백준 1663 -XYZ 문자열  (0) 2023.05.03
[Java] 이항계수 /백준 1010, 11051  (0) 2023.05.01
복사했습니다!