CodingTest/Java

BOJ_7569 : ν† λ§ˆν† 

Soom_1n 2023. 2. 3. 09:15

πŸ‘‰ 문제링크

 

7569번: ν† λ§ˆν† 

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

www.acmicpc.net



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

  • H x N x M 크기의 창고에 μ΅κ±°λ‚˜ 덜 읡은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆλ‹€. 
    • 읡은 ν† λ§ˆν† λŠ” μƒν•˜μ’Œμš°μ „ν›„μ˜ 덜 읡은 ν† λ§ˆν† λ₯Ό λ‹€μŒ λ‚  읡게 ν•œλ‹€.
    • 빈 칸도 μžˆλ‹€.
    • ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡을 λ•Œ κΉŒμ§€ μ΅œμ†Œ 며칠이 κ±Έλ¦¬λŠ”μ§€ 좜λ ₯ν•œλ‹€.
    • λͺ¨λ‘ 읡지 λͺ»ν•˜λ©΄ -1을 좜λ ₯ν•œλ‹€.
  • BFSλ₯Ό 톡해 읡은 ν† λ§ˆν†  μ˜† 덜 읡은 ν† λ§ˆν† λ“€μ΄ λͺ¨λ‘ 읡을 λ•Œ κΉŒμ§€ κ±Έλ¦¬λŠ” 날을 κ³„μ‚°ν•œλ‹€.
    • νμ—μ„œ 방금 읡은 ν† λ§ˆν† μ˜ μ’Œν‘œλ₯Ό κΊΌλ‚Έλ‹€.
    • κΊΌλ‚Έ ν† λ§ˆν†  μ£Όλ³€μ˜ 덜 읡은 ν† λ§ˆν† μ˜ 값을 ν˜„μž¬ κ°’+1 둜 λ°”κΎΈκ³ , μ’Œν‘œλ₯Ό 큐에 λ„£λŠ”λ‹€.
    • 큐가 빌 λ•Œ κΉŒμ§€ λ°˜λ³΅ν•œλ‹€.
  • ν† λ§ˆν†  μ°½κ³ μ—μ„œ κ°€μž₯ 큰 값을 좜λ ₯ν•œλ‹€.
    • 0이 있으면 -1을 λ°˜ν™˜ν•œλ‹€. (λͺ¨λ‘ 읡을 수 μ—†μŒ)

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

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

public class Main {
    public static void main(String[] args) {
        // input
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        int h = sc.nextInt();
        int[][][] arr = new int[h][n][m];

        Queue<Tomato> que = new LinkedList<>();

        for (int i = 0; i < h; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < m; k++) {
                    arr[i][j][k] = sc.nextInt();
                    if (arr[i][j][k] == 1)
                        que.add(new Tomato(j, k, i));
                }
            }
        }

        // BFS
        //          μ „ 우 ν›„ 쒌 상 ν•˜
        int[] dx = {-1, 0, 1, 0, 0, 0};
        int[] dy = {0, 1, 0, -1, 0, 0};
        int[] dz = {0, 0, 0, 0, 1, -1};

        while(!que.isEmpty()) {
            Tomato tomato = que.poll();

//            System.out.println(tomato.h + " " + tomato.n + " " + tomato.m);
//            print(arr);


            for (int i = 0; i < dx.length; i++) {
                int x = tomato.n + dx[i];
                int y = tomato.m + dy[i];
                int z = tomato.h + dz[i];

                if (0 <= x && x < n &&
                    0 <= y && y < m &&
                    0 <= z && z < h &&
                    arr[z][x][y] == 0) {
                    arr[z][x][y] = arr[tomato.h][tomato.n][tomato.m] + 1;
                    que.add(new Tomato(x,y,z));
                }
            }
        }
//        print(arr);

        System.out.println(tomato(arr));

    }
    private static int tomato(int[][][] arr) {
        int max = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                for (int k = 0; k < arr[i][j].length; k++) {
                    if (arr[i][j][k] == 0)
                        return -1;
                    if (arr[i][j][k] > max)
                        max = arr[i][j][k];
                };
            }
        }
        return max-1;
    }

    private static class Tomato {
        int n, m, h;

        public Tomato(int n, int m, int h) {
            this.n = n;
            this.m = m;
            this.h = h;
        }
    }
    private static void print(int[][][] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                for (int k = 0; k < arr[i][j].length; k++) {
                    System.out.print(arr[i][j][k] + " ");
                }
                System.out.println();
            }
            System.out.println("\n----------------------------------------\n");
        }
        System.out.println("\n==========================================\n");
    }
}

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

  • 창고의 높이 h, μ„Έλ‘œ λ„ˆλΉ„ n, κ°€λ‘œ λ„ˆλΉ„ hλ₯Ό μž…λ ₯λ°›κ³  μ°½κ³  λ°°μ—΄ arr에 값을 μ €μž₯ν•œλ‹€.
    • 큐λ₯Ό λ§Œλ“€μ–΄μ„œ arr에 값을 넣을 λ•Œ 1인 μ’Œν‘œλ₯Ό μ΄ˆκΈ°κ°’μœΌλ‘œ λ„£μ–΄μ€€λ‹€.
    • μ’Œν‘œλ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ Tomato 클래슀λ₯Ό λ§Œλ“€μ–΄ h, n, m 값을 μ†μ„±μœΌλ‘œ μ €μž₯ν•œλ‹€.
  • BFSλ₯Ό μˆ˜ν–‰ν•œλ‹€.
    • μ’Œν‘œ 이동을 μœ„ν•΄ μ „μ’Œν›„μš°μƒν•˜ λ°©ν–₯의 h,n,m 인덱슀 λ³€ν™” λ°°μ—΄ dx, dy, dzλ₯Ό μ΄ˆκΈ°ν™” ν•œλ‹€.
    • 큐가 빌 λ•ŒκΉŒμ§€ 계산을 λ°˜λ³΅ν•œλ‹€.
      • νμ—μ„œ Tomato 객체λ₯Ό ν•˜λ‚˜ poll() ν•œλ‹€.
      • 6λ°©ν–₯의 h, m, n 이동을 ν™•μΈν•΄μ„œ μ°½κ³  λ²”μœ„ 내이며 값이 0이면 ν˜„μž¬ κ°’+1을 μ €μž₯ν•˜κ³  ν•΄λ‹Ή μ’Œν‘œλ₯Ό 큐에 μ €μž₯ν•œλ‹€.
  • arr에 0이 λ‚¨μ•„μžˆμœΌλ©΄ -1을 좜λ ₯ν•˜κ³ , μ—†λ‹€λ©΄ arr의 μ›μ†Œ 쀑 μ΅œλŒ€κ°’-1을 좜λ ₯ν•œλ‹€.

πŸ”Έ end πŸ”Έ

  • 이전 ν† λ§ˆν† λŠ” 큐λ₯Ό 2개λ₯Ό μ‚¬μš©ν•΄ λ³΅μ‚¬ν•˜λ©° ν’€μ΄ν–ˆλŠ”λ°, arr에 값을 λˆ„μ ν•˜λŠ” λ°©μ‹μ˜ 풀이λ₯Ό 보고 μ΄λ²ˆμ— μ μš©ν•΄λ³΄μ•˜λ‹€.
    • BFSμ—μ„œ μ‚¬μš©ν•˜κΈ° μ•„μ£Ό 쒋은 방법인 것 κ°™λ‹€.
  • printλ©”μ„œλ“œλŠ” 보톡 μ§€μš°λŠ”λ°, μ΄λ²ˆμ—” μžˆλŠ” κ·ΈλŒ€λ‘œ μ˜¬λ Έλ‹€.
    • 생각보닀 λ‚˜μ˜μ§€ μ•Šμ€ 것 κ°™μ•„μ„œ μ½”λ“œμ— 남겨두렀고 ν•œλ‹€.
  • 같은 μ•Œκ³ λ¦¬μ¦˜μ˜ 문제λ₯Ό ν’€μ—ˆλ”λ‹ˆ 적을 것듀이 λ§Žμ§€ μ•Šμ•˜λ‹€.
    • 계속 κ°„λ‹¨νžˆ μ“Έ 수 μžˆλ„λ‘ μ—°μŠ΅ν•  생각이닀.

728x90