λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🎯PS - Baekjoon, etc/BFS

πŸ₯‡[λ°±μ€€, 7576] ν† λ§ˆν†  (Java)

by hyeon-z 2023. 3. 21.

 

문제 링크

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

 

7576번: ν† λ§ˆν† 

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,N이 μ£Όμ–΄μ§„λ‹€. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M,N ≤ 1,000 이닀. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” ν•˜λ‚˜μ˜ μƒμžμ— μ €μž₯된 ν† λ§ˆν† 

www.acmicpc.net

 

λ‚œμ΄λ„

 

μ‹œκ°„μ œν•œ

1초

 

문제

철수의 ν† λ§ˆν†  λ†μž₯μ—μ„œλŠ” ν† λ§ˆν† λ₯Ό λ³΄κ΄€ν•˜λŠ” ν° μ°½κ³ λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

ν† λ§ˆν† λŠ” μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό κ°™μ΄ κ²©μž λͺ¨μ–‘ μƒμžμ˜ μΉΈμ— ν•˜λ‚˜μ”© λ„£μ–΄μ„œ μ°½κ³ μ— λ³΄κ΄€ν•œλ‹€.


창고에 λ³΄κ΄€λ˜λŠ” ν† λ§ˆν† λ“€ μ€‘μ—λŠ” μž˜ μ΅μ€ κ²ƒλ„ μžˆμ§€λ§Œ, μ•„직 μ΅μ§€ μ•Šμ€ ν† λ§ˆν† λ“€λ„ μžˆμ„ μˆ˜ μžˆλ‹€.
보관 ν›„ ν•˜λ£¨κ°€ μ§€λ‚˜λ©΄, μ΅μ€ ν† λ§ˆν† λ“€μ˜ μΈμ ‘ν•œ κ³³μ— μžˆλŠ” μ΅μ§€ μ•Šμ€ ν† λ§ˆν† λ“€μ€ μ΅μ€ ν† λ§ˆν† μ˜ μ˜ν–₯을 λ°›μ•„ μ΅κ²Œ λœλ‹€.


ν•˜λ‚˜μ˜ ν† λ§ˆν† μ˜ μΈμ ‘ν•œ κ³³μ€ μ™Όμͺ½, μ˜€λ₯Έμͺ½, μ•ž, λ’€ λ„€ λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ₯Ό μ˜λ―Έν•œλ‹€.
λŒ€κ°μ„  λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ“€μ—κ²ŒλŠ” μ˜ν–₯을 μ£Όμ§€ λͺ»ν•˜λ©°, ν† λ§ˆν† κ°€ ν˜Όμž μ €μ ˆλ‘œ μ΅λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•œλ‹€.


μ² μˆ˜λŠ” μ°½κ³ μ— λ³΄κ΄€λœ ν† λ§ˆν† λ“€μ΄ λ©°μΉ μ΄ μ§€λ‚˜λ©΄ λ‹€ μ΅κ²Œ λ˜λŠ”μ§€, κ·Έ μ΅œμ†Œ μΌμˆ˜λ₯Ό μ•Œκ³  μ‹Άμ–΄ ν•œλ‹€.

ν† λ§ˆν† λ₯Ό μ°½κ³ μ— λ³΄κ΄€ν•˜λŠ” κ²©μžλͺ¨μ–‘μ˜ μƒμžλ“€μ˜ ν¬κΈ°μ™€ μ΅μ€ ν† λ§ˆν† λ“€κ³Ό μ΅μ§€ μ•Šμ€ ν† λ§ˆν† λ“€μ˜ μ •보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, λ©°μΉ μ΄ μ§€λ‚˜λ©΄ ν† λ§ˆν† λ“€μ΄ λͺ¨λ‘ μ΅λŠ”μ§€, κ·Έ μ΅œμ†Œ μΌμˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.
단, μƒμžμ˜ μΌλΆ€ μΉΈμ—λŠ” ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

 

μž…λ ₯

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M, N이 μ£Όμ–΄μ§„λ‹€.
M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≤ M, N ≤ 1,000이닀.


λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” ν•˜λ‚˜μ˜ μƒμžμ— μ €μž₯된 ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ§„λ‹€.
즉, λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” μƒμžμ— λ‹΄κΈ΄ ν† λ§ˆν† μ˜ 정보가 μ£Όμ–΄μ§„λ‹€.
ν•˜λ‚˜μ˜ μ€„μ—λŠ” μƒμž κ°€λ‘œμ€„μ— λ“€μ–΄μžˆλŠ” ν† λ§ˆν† μ˜ μƒνƒœκ°€ M개의 μ •μˆ˜λ‘œ μ£Όμ–΄μ§„λ‹€.
μ •μˆ˜ 1은 읡은 ν† λ§ˆν† , μ •μˆ˜ 0은 읡지 μ•Šμ€ ν† λ§ˆν† , μ •μˆ˜ -1은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 칸을 λ‚˜νƒ€λ‚Έλ‹€.
ν† λ§ˆν† κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” 경우만 μž…λ ₯으둜 μ£Όμ–΄μ§„λ‹€.

 

좜λ ₯

μ—¬λŸ¬λΆ„μ€ ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ„ λ•ŒκΉŒμ§€μ˜ μ΅œμ†Œ λ‚ μ§œλ₯Ό μΆœλ ₯ν•΄μ•Ό ν•œλ‹€.
λ§Œμ•½, μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœμ΄λ©΄ 0을 μΆœλ ₯ν•΄μ•Ό ν•˜κ³ , ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” μƒν™©μ΄λ©΄ -1을 μΆœλ ₯ν•΄μ•Ό ν•œλ‹€.

 

μž…μΆœλ ₯ μ˜ˆμ‹œ 1

μž…λ ₯

6 4
1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1

 

좜λ ₯

6

 

μž…μΆœλ ₯ μ˜ˆμ‹œ 2 ( ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡지 λͺ»ν•˜λŠ” μƒνƒœ )

μž…λ ₯

6 4
0 -1 0 0 0 0
-1 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1

 

좜λ ₯

-1

 

μž…μΆœλ ₯ μ˜ˆμ‹œ 3 ( μ €μž₯될 λ•ŒλΆ€ν„° ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ–΄μžˆλŠ” μƒνƒœ )

μž…λ ₯

2 2
1 -1
-1 1

 

좜λ ₯

0

문제 풀이 κ³Όμ •

μ˜ˆμ‹œλ₯Ό 톡해 문제 μ΄ν•΄ν•˜κΈ°

 

μ˜ˆμ‹œ 1을 μ‚΄νŽ΄λ³΄μž.

 

Day 0 (처음 μƒνƒœ)

1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1

 

Day 1

1 -1 0 0 0 0
1 -1 0 0 0 0
0 0 0 0 -1 1
0 0 0 0 -1 1

 

Day 2

1 -1 0 0 0 0
1 -1 0 0 0 1
1 0 0 0 -1 1
0 0 0 0 -1 1

 

Day 

1 -1 0 0 0 1
1 -1 0 0 1 1
1 0 0 -1 1
1 0 0 0 -1 1

 

Day 4

1 -1 0 0 1 1
1 -1 0 1 1 1
1 1 1 0 -1 1
1 1 0 0 -1 1

 

Day 5

1 -1 0 1 1 1
1 -1 1 1 1 1
1 1 1 1 -1 1
1 1 1 0 -1 1

 

Day 6

1 -1 1 1 1 1
1 -1 1 1 1 1
1 1 1 1 -1 1
1 1 1 1 -1 1

μ΄λŸ¬ν•œ 과정을 κ±°μ³μ„œ ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅λŠ” λ°μ—λŠ” 6일이 κ±Έλ¦°λ‹€.

 

ν•˜λ£¨κ°€ μ§€λ‚  λ•Œλ§ˆλ‹€ ν† λ§ˆν† μ˜ μƒν•˜μ’Œμš°λ‘œ ν•œ μΉΈμ”©μ˜ ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡게 λœλ‹€.

이λ₯Ό 톡해 이 λ¬Έμ œμ—μ„œλŠ” BFS의 κ°œλ…μ΄ μ“°μ΄λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

ν•΄λ‹Ή κ°œλ…μ— λŒ€ν•΄ μžμ„Ένžˆ μ•Œκ³  μ‹Άλ‹€λ©΄ μ°Έκ³ ν•˜κΈΈ λ°”λž€λ‹€.

 

[μ•Œκ³ λ¦¬μ¦˜] BFS

BFSλž€? Breadth First Search, λ„ˆλΉ„ μš°μ„  탐색 κ°€κΉŒμš΄ λ…Έλ“œλΆ€ν„° νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜ λ™μž‘ κ³Όμ • 1. 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό 큐에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ 처리λ₯Ό ν•œλ‹€. 2. νμ—μ„œ λ…Έλ“œλ₯Ό κΊΌλ‚΄ ν•΄λ‹Ή λ…Έλ“œμ˜ 인접 λ…Έλ“œ μ€‘μ—μ„œ

hyeon-z.tistory.com

 

μž…λ ₯ κ°’ μ €μž₯ν•˜κΈ°

 

총 4κ°€μ§€ μš”μ†Œλ₯Ό μ„ μ–Έν•΄μ•Ό ν•œλ‹€.

 

1. μƒμžμ— λ‹΄κΈ΄ ν† λ§ˆν† λ₯Ό μ €μž₯ν•  λ°°μ—΄ (board)

2. BFS κ΅¬ν˜„μ„ μœ„ν•΄ 쓰일 큐 (queue)

3. μƒμžμ˜ κ°€λ‘œ 칸의 수 (M)

4. μƒμžμ˜ μ„Έλ‘œ 칸의 수 (N)

 

public class BOJ_7576 {
    static int[][] board;
    static Queue<Tomato> queue;
    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());
        queue = new LinkedList<>();

        M = Integer.parseInt(st.nextToken());  // κ°€λ‘œ
        N = Integer.parseInt(st.nextToken());  // μ„Έλ‘œ
        board = new int[N][M];

        // ν† λ§ˆν†  μΉΈ μž…λ ₯ λ°›κΈ°
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
                if (board[i][j] == 1) {
                    queue.offer(new Tomato(i, j));
                }
            }
        }
    }
}

ν† λ§ˆν†  칸을 μž…λ ₯λ°›μœΌλ©΄μ„œ ν•΄λ‹Ή 칸의 ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” 경우 큐에 μΆ”κ°€ν•œλ‹€.

 

ν† λ§ˆν†  클래슀 κ΅¬ν˜„

 

ν† λ§ˆν† μ˜ μœ„μΉ˜λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν•΄λ‹Ή ν† λ§ˆν† μ˜ xμ’Œν‘œ, yμ’Œν‘œλ₯Ό μ €μž₯ν•΄μ•Ό ν•œλ‹€.

κ·Έλ₯Ό μœ„ν•΄ xμ’Œν‘œμ™€ yμ’Œν‘œλ₯Ό κ°€μ§€λŠ” ν† λ§ˆν†  클래슀λ₯Ό κ΅¬ν˜„ν•œλ‹€.

class Tomato {
    int x;
    int y;

    Tomato(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

 

bfs λ©”μ„œλ“œ κ΅¬ν˜„

 

public static int bfs() {
    // μƒν•˜μ’Œμš°
    int[] dx = {-1, 1, 0, 0};
    int[] dy = {0, 0, -1, 1};
    int day = 0;
    int size = queue.size();

    while (!queue.isEmpty()) {
        for (int i = 0; i < size; i++) {
            Tomato tomato = queue.poll();

            int x = tomato.x;
            int y = tomato.y;

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

                if (nx < 0 || nx > N - 1 || ny < 0 || ny > M - 1) {
                    continue;
                }

                if (board[nx][ny] == 0) {
                    board[nx][ny] = 1;
                    queue.offer(new Tomato(nx, ny));
                }
            }
        }
        size = queue.size();
        day += 1;
    }

    if (checkTomato()) return day - 1;
    return -1;
}

 

ν•˜λ£¨ λ™μ•ˆ ν† λ§ˆν† λ₯Ό νƒμƒ‰ν•˜λŠ” 과정을 μ‚΄νŽ΄λ³΄μž.

 

1. 큐의 맨 μ•žμ— μ‘΄μž¬ν•˜λŠ” ν† λ§ˆν† λ₯Ό μ œκ±°ν•œλ‹€.

2. ν•΄λ‹Ή ν† λ§ˆν† μ˜ μƒν•˜μ’Œμš°λ₯Ό ν™•μΈν•˜λ©° λ²”μœ„ λ‚΄μ˜ μ’Œν‘œμΈμ§€ ν™•μΈν•œλ‹€.

3. 2의 쑰건을 λ§Œμ‘±ν•˜κ³  칸의 값이 0인 경우 칸의 값을 1둜 λ°”κΎΌ ν›„ 큐에 λ„£λŠ”λ‹€. 즉 ν† λ§ˆν† λ₯Ό μ΅νžŒλ‹€.

4. 큐에 λ“€μ–΄κ°€ μžˆλŠ” ν† λ§ˆν†  개수 즉 큐의 μ‚¬μ΄μ¦ˆλ§ŒνΌ 1, 2, 3 과정을 λ°˜λ³΅ν•œλ‹€.

5. 큐의 μ‚¬μ΄μ¦ˆλ₯Ό μƒˆλ‘œ μ €μž₯ν•œλ‹€.

6. λ‚ μ§œλ₯Ό ν•˜λ£¨ λ”ν•œλ‹€.

 

μœ„μ—μ„œ μ„€λͺ…ν–ˆλ˜ μ˜ˆμ‹œμ™€ ν•¨κ»˜ μ’€ 더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μž.

λͺ¨λ“  과정은 큐가 λΉ„κ²Œ 되면 μ’…λ£Œλœλ‹€.

 

처음 ν† λ§ˆν†  칸을 μž…λ ₯λ°›μœΌλ©΄μ„œ μ΅μ–΄μžˆλŠ” ν† λ§ˆν† μ˜ 경우 queue에 λ„£λŠ”λ‹€.

Day 0 (처음 μƒνƒœ)

1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1

Day 0의 큐에 (0, 0), (3, 5)κ°€ λ‹΄κΈ΄λ‹€.

 

Day 0의 큐의 size만큼 for문을 돌며 ν† λ§ˆν† μ˜ μƒν•˜μ’Œμš°λ₯Ό ν™•μΈν•œ ν›„ ν† λ§ˆν† λ“€μ„ 읡히면 ν•˜λ£¨κ°€ μ§€λ‚˜κ°„λ‹€.

Day 1

1 -1 0 0 0 0
1 -1 0 0 0 0
0 0 0 0 -1 1
0 0 0 0 -1 1

Day 1의 νμ—λŠ” Day 0의 큐의 μƒν•˜μ’Œμš°μ˜ 값이 0인 κ²½μš°μ— ν•΄λ‹Ήλ˜λŠ” μ’Œν‘œμΈ (1, 0), (2, 5)κ°€ λ‹΄κΈ΄λ‹€. 

 

μ΄λŸ¬ν•œ 과정이 반볡되고 Day 6이 λœλ‹€.

Day 6

1 -1 1 1 1 1
1 -1 1 1 1 1
1 1 1 1 -1 1
1 1 1 1 -1 1

μΆ”κ°€λœ ν† λ§ˆν† λ“€μ˜ μƒν•˜μ’Œμš°μ— 더 이상 읡힐 ν† λ§ˆν† κ°€ μ—†μœΌλ―€λ‘œ 큐가 λΉ„κ²Œ λ˜μ–΄ while문이 μ’…λ£Œλœλ‹€.

 

좜λ ₯ν•  λ•Œ ν† λ§ˆν†  칸을 μ²΄ν¬ν•˜λŠ” λ©”μ„œλ“œ κ΅¬ν˜„

 

μœ„μ˜ 좜λ ₯을 보면 ν•΄λ‹Ή 쑰건이 μ‘΄μž¬ν•œλ‹€.

ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” 상황이면 -1을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

 

static boolean checkTomato() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (board[i][j] == 0) {
                return false;
            }
        }
    }
    return true;
}

 

ν† λ§ˆν†  칸을 λŒλ©΄μ„œ 읡지 μ•Šμ€ ν† λ§ˆν† κ°€ μ‘΄μž¬ν•˜λŠ” 경우 falseλ₯Ό return ν•˜κ³  κ·Έ μ™Έμ˜ 경우 trueλ₯Ό return ν•œλ‹€.

 

bfs λ©”μ„œλ“œ 마무리

 

μœ„μ˜ bfs λ©”μ„œλ“œμ—μ„œ μ„€λͺ…ν•˜μ§€ μ•Šκ³  λ„˜μ–΄κ°„ 뢀뢄이 μžˆλ‹€.

if (checkTomato()) return day - 1;
return -1;

 

while문이 μ’…λ£Œλœ ν›„ ν† λ§ˆν†  칸을 체크해야 ν•œλ‹€.

ν•΄λ‹Ή ν•¨μˆ˜κ°€ true인 경우, λͺ¨λ“  ν† λ§ˆν† κ°€ 읡은 μƒνƒœμ΄κΈ° λ•Œλ¬Έμ— day - 1을 return ν•œλ‹€.

κ·Έ μ™Έμ˜ κ²½μš°μ—λŠ” ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡지 λͺ»ν•˜λŠ” μƒν™©μ΄λ―€λ‘œ -1을 return ν•œλ‹€.

 

μ™œ dayκ°€ μ•„λ‹Œ day - 1을 return ν• κΉŒ?

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ Day 6일 λ•Œ queueμ—λŠ” λ§ˆμ§€λ§‰μœΌλ‘œ 읡은 2개의 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆλ‹€. μ΄λ•Œ λͺ¨λ“  ν† λ§ˆν† κ°€ 읡게 λ˜μ§€λ§Œ κ·Έλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ ν•œλ²ˆ 더 반볡문이 돌게 λœλ‹€. μ‹€μ§ˆμ μœΌλ‘œ ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡은 μˆœκ°„μ€ λ§ˆμ§€λ§‰ 반볡문이 돌기 μ „μ˜ 날이기 λ•Œλ¬Έμ— day - 1을 return ν•œλ‹€.

 

λ˜ν•œ κ³ λ €ν•΄μ•Όν•  좜λ ₯ 쑰건이 ν•˜λ‚˜ 더 μžˆλ‹€.

μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœμ΄λ©΄ 0을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

μ½”λ“œλ₯Ό μΆ”κ°€ν•˜μ§€ μ•Šμ•„λ„ 0이 좜λ ₯λ˜λ―€λ‘œ κ·ΈλŒ€λ‘œ κ΅¬ν˜„μ„ λ§ˆλ¬΄λ¦¬ν•œλ‹€.

 

μ΅œμ’… μ½”λ“œ

 

public class BOJ_7576 {
    static int[][] board;
    static Queue<Tomato> queue;
    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());
        queue = new LinkedList<>();

        M = Integer.parseInt(st.nextToken());  // κ°€λ‘œ
        N = Integer.parseInt(st.nextToken());  // μ„Έλ‘œ
        board = new int[N][M];

        // ν† λ§ˆν†  μΉΈ μž…λ ₯ λ°›κΈ°
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < M; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
                if (board[i][j] == 1) {
                    queue.offer(new Tomato(i, j));
                }
            }
        }

        System.out.println(bfs());
    }

    public static int bfs() {
        // μƒν•˜μ’Œμš°
        int[] dx = {-1, 1, 0, 0};
        int[] dy = {0, 0, -1, 1};
        int day = 0;
        int size = queue.size();

        while (!queue.isEmpty()) {
            for (int i = 0; i < size; i++) {
                Tomato tomato = queue.poll();

                int x = tomato.x;
                int y = tomato.y;

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

                    if (nx < 0 || nx > N - 1 || ny < 0 || ny > M - 1) {
                        continue;
                    }

                    if (board[nx][ny] == 0) {
                        board[nx][ny] = 1;
                        queue.offer(new Tomato(nx, ny));
                    }
                }
            }
            size = queue.size();
            day += 1;
        }

        if (checkTomato()) return day - 1;
        return -1;
    }

    static boolean checkTomato() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (board[i][j] == 0) {
                    return false;
                }
            }
        }
        return true;
    }
}

λŒ“κΈ€