My Blog

[JAVA] 7576번: 토마토 본문

알고리즘/백준

[JAVA] 7576번: 토마토

JAESG 2023. 2. 4. 17:10

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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

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

class Point {
    int x;
    int y;

    Point(int x, int y) {
        this.x = x; //세로
        this.y = y; //가로
    }
}

public class _7576 {
    static StringTokenizer st;
    static int[][] data;
    static Queue<Point> tomato = new LinkedList<>();
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static int day = 0;
    static int m, n;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer(br.readLine());
        //가로
        m = Integer.parseInt(st.nextToken());
        //세로
        n = Integer.parseInt(st.nextToken());
        data = new int[n][m];
        //맵 생성
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                data[i][j] = Integer.parseInt(st.nextToken());
                if (data[i][j] == 1) {
                    tomato.add(new Point(i, j));
                }
            }
        }

        System.out.println(BFS());


    }

    static int BFS() {
        while (!tomato.isEmpty()) {

            day += 1;
            Point point = tomato.poll();
            int x = point.x;
            int y = point.y;
            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (nx >= 0 && ny >= 0 && nx < n && ny < m) {
                    if (data[nx][ny] == 0) {
                        data[nx][ny] = data[x][y] + 1;
                        tomato.add(new Point(nx, ny));
                    }
                }
            }
        }

        int day = Integer.MIN_VALUE;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (data[i][j] == 0) {
                    return -1;
                }
                day = Math.max(day, data[i][j]);
            }
        }
        return day - 1;
    }
}
728x90

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

[JAVA] 1149: RGB거리  (0) 2023.02.06
[JAVA] 7569번: 토마토  (0) 2023.02.04
자바 특수문자 split 함수 나누는 법  (0) 2023.01.17
Comments