CodingTest/Java

BOJ_7576 : ν† λ§ˆν† 

Soom_1n 2023. 1. 30. 16:51

πŸ‘‰ 문제링크

 

7576번: ν† λ§ˆν† 

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

www.acmicpc.net



πŸ”Έ 문제 뢄석 πŸ”Έ

  •  n x m 크기의 창고에 ν† λ§ˆν† κ°€ λ†“μ—¬μžˆλ‹€.
    • 1 : 읡은 ν† λ§ˆν† , 0 : 덜 읡은 ν† λ§ˆν† , -1 : 빈 곡간
    • 읡은 ν† λ§ˆν† λŠ” ν•˜λ£¨κ°€ μ§€λ‚  λ•Œ λ§ˆλ‹€ μƒν•˜μ’Œμš° 덜 읡은 ν† λ§ˆν† λ₯Ό 읡게 λ§Œλ“ λ‹€.
    • 며칠이 μ§€λ‚˜μ•Ό ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅λŠ”μ§€ 좜λ ₯ν•œλ‹€. λͺ¨λ‘ 읡지 λͺ»ν•˜λ©΄ -1 을 좜λ ₯ν•œλ‹€.
  • 읡은 ν† λ§ˆν†  주변에 읡을 수 μžˆλŠ” ν† λ§ˆν† λ₯Ό 큐에 λ„£κ³  BFS을 μ‹€ν–‰ν•œλ‹€.
    • 며칠이 μ§€λ‚˜λŠ”μ§€ 확인해야 ν•˜λ―€λ‘œ 읡을 μ˜ˆμ •μΈ ν† λ§ˆν† λ“€μ€ 같은 큐에 λ„£μ§€ μ•Šκ³ , μž„μ‹œ 큐에 μ €μž₯ν•œλ‹€.
    • 초기 큐의 μ›μ†Œλ₯Ό λͺ¨λ‘ κΊΌλ‚΄λ©΄ μž„μ‹œνλ₯Ό 확인해 μ›μ†Œκ°€ μžˆλŠ”μ§€(μ•žμœΌλ‘œ 읡을 ν† λ§ˆν† κ°€ μžˆλŠ”μ§€) ν™•μΈν•œλ‹€.
    • μž„μ‹œ 큐의 μ›μ†Œλ₯Ό 초기 큐에 λ³΅μ‚¬ν•˜κ³ , μž„μ‹œ νλŠ” λΉ„μ›Œλ²„λ¦°λ‹€.
    • μž„μ‹œ 큐의 값이 없을 λ•Œ κΉŒμ§€ λ°˜λ³΅ν•œλ‹€.
  • n x m 크기의 μ°½κ³ λ₯Ό μˆœνšŒν•΄ λœμ΅μ€ ν† λ§ˆν† κ°€ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
    • 있으면 -1을 좜λ ₯ν•œλ‹€.
    • μ—†μœΌλ©΄ μ§€λ‚˜κ°„ λ‚ μ§œλ₯Ό 좜λ ₯ν•œλ‹€.

πŸ”Έ μ½”λ“œ πŸ”Έ

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 1) input
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        int[][] arr = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arr[i][j] = sc.nextInt();
            }
        }

        // 2) BFS
        int[] dx = {-1, 0, 1, 0};
        int[] dy = {0, 1, 0, -1};

        int day = 0;

        Queue<Pair> que = new LinkedList<>();
        Queue<Pair> temp = new LinkedList<>();

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (arr[i][j] == 1) {
                    for (int k = 0; k < 4; k++) {
                        int x = i + dx[k];
                        int y = j + dy[k];
                        if (0 <= x && x < n && 0 <= y && y < m && arr[x][y] == 0) {
                            temp.add(new Pair(x, y));
                        }
                    }
                }
            }
        }

        while (!temp.isEmpty()) {
            day++;
            que = temp;
            temp = new LinkedList<>();
            while (!que.isEmpty()) {
                Pair p = que.poll();
                arr[p.x][p.y] = 1;
                for (int i = 0; i < 4; i++) {
                    int x = p.x + dx[i];
                    int y = p.y + dy[i];
                    if (0 <= x && x < n && 0 <= y && y < m && arr[x][y] == 0) {
                        arr[x][y] = 1;
                        temp.add(new Pair(x, y));
                    }
                }
            }
        }

        boolean flag = false;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (arr[i][j] == 0) {
                    flag = true;
                    break;
                }
            }
        }

        if (flag)
            System.out.println(-1);
        else
            System.out.println(day);
    }

    private static class Pair {
        int x, y;

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

πŸ”Έ μ½”λ“œ 해석 πŸ”Έ

  • μ’Œν‘œλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ Pair클래슀λ₯Ό μ •μ˜ν•œλ‹€.
  • μž…λ ₯
    • n X m 크기 창고의 ν† λ§ˆν†  정보λ₯Ό 2차원 λ°°μ—΄ arr에 μ €μž₯ν•œλ‹€.
  • BFS
    • 2개의 큐 que, tempλ₯Ό μ„ μ–Έν•œλ‹€.
    • temp의 μ΄ˆκΈ°κ°’μ„ λ„£μ–΄μ£ΌκΈ° μœ„ν•΄, λ¨Όμ € arrλ₯Ό μˆœνšŒν•œλ‹€.
      • 값이 1이면 μƒν•˜μ’Œμš°λ₯Ό 확인해 μ•žμœΌλ‘œ 읡을 ν† λ§ˆν† κ°€ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
      • μ•žμœΌλ‘œ 읡을 ν† λ§ˆν† μ˜ μ’Œν‘œλ₯Ό temp에 λ„£μ–΄μ€€λ‹€.
    • 큐 tempκ°€ 빌 λ•ŒκΉŒμ§€ λ‹€μŒ 계산을 λ°˜λ³΅ν•œλ‹€.
      • ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ„λ•Œ κΉŒμ§€ ν•„μš”ν•œ λ‚ μ§œ day λ³€μˆ˜λ₯Ό +1 ν•œλ‹€.
      • que에 tempλ₯Ό λ³΅μ‚¬ν•˜κ³ , tempλŠ” μ΄ˆκΈ°ν™”ν•œλ‹€.
      • 큐 queκ°€ 빌 λ•ŒκΉŒμ§€ 계산을 λ°˜λ³΅ν•œλ‹€.
        • que의 μ›μ†Œλ₯Ό pollν•œλ‹€.
        • ν•΄λ‹Ή μ’Œν‘œμ˜ 값을 1둜 λ³€κ²½ν•œλ‹€. (temp의 μ΄ˆκΈ°ν™” λ•Œλ¬Έμ΄λ―€λ‘œ, day == 1μ—μ„œλ§Œ μ‹€ν–‰ 됨)
        • μƒν•˜μ’Œμš° 4λ°©ν–₯을 ν™•μΈν•œλ‹€.
          • μƒν•˜μ’Œμš° μΈλ±μŠ€κ°€ μ°½κ³  λ²”μœ„ 내이며 값이 0이면,
            ν•΄λ‹Ή μ’Œν‘œμ˜ 값을 1둜 λ°”κΎΈκ³  temp에 Pair객체 μ’Œν‘œλ₯Ό μΆ”κ°€ν•œλ‹€.
  • 좜λ ₯
    • μ°½κ³  arrλ₯Ό μˆœνšŒν•΄ λœμ΅μ€ ν† λ§ˆν†  (0)이 λ‚¨μ•„μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
      • λ‚¨μ•„μžˆμœΌλ©΄ -1, μ—†μœΌλ©΄ dayλ₯Ό 좜λ ₯ν•œλ‹€.

πŸ”Έ end πŸ”Έ

  • κ³¨λ“œ 5 μΉ˜κ³ λŠ” 비ꡐ적 μ‰¬μ› λ˜ 것 κ°™λ‹€.
    • BFS에 μ΅μˆ™ν•˜κ³ , 문제λ₯Ό 이전에 ν•œ 번 λ΄€μ–΄μ„œ κ·ΈλŸ°λ“― ν•˜λ‹€.
  • 처음 큐 temp에 값을 μ΄ˆκΈ°ν™” ν•  λ•Œ, BFS의 μ•ˆμͺ½ while 처럼 μ’Œν‘œPair객체λ₯Ό λ„£μœΌλ©΄μ„œ 값을 1둜 λ°”κΏ¨λ”λ‹ˆ λ‹€μŒ for문에 영ν–₯이 κ°”λ‹€.
    • κ·Έλž˜μ„œ BFS μ•ˆμͺ½ while문에 arr[p.x][p.y] = 1μ΄λΌλŠ” μ½”λ“œλ₯Ό λ„£μ—ˆλŠ”λ°, dayκ°€ 1μΌλ•Œλ§Œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ— μ’€ 아쉬웠닀.
    • κ·Έλ ‡λ‹€κ³  κ°€μž₯ μ•ˆμͺ½ ifλ¬Έμ—μ„œ 1을 λ„£μ–΄μ£ΌλŠ”κ±Έ λΉΌλ©΄ 쀑볡이 λ§Žμ•„μ§„λ‹€.
  • 문제 νŒŒμ•… 및 μ½”λ”© 섀계λ₯Ό 적어가며 ν’€μ΄ν–ˆμ§€λ§Œ, λ³„λ‘œ 도움이 λ˜μ§€ μ•Šμ€ 것 κ°™μ•„ 아쉽닀.
    • 아직 문제λ₯Ό 적어가며 ν‘ΈλŠ”κ²Œ μ΅μˆ™ν•˜μ§€ μ•Šμ€ 것 κ°™λ‹€.
  • λ°˜λ‘€λ„ λ§Œλ“€μ–΄λ΄€μœΌλ©΄ μ’‹μ•˜μ„ν…λ° 뒷심이 μ’€ λΆ€μ‘±ν–ˆλ‹€.
  • 질의 μ‘λ‹΅μ—μ„œ 닡변을 μ μ–΄λ΄€λŠ”λ°, μˆ˜μ •ν•œ μ§ˆλ¬ΈμžλΆ„ μ½”λ“œκ°€ 2λ°° 더 λΉ¨λžλ‹€...

728x90