λ°˜μ‘ν˜•
Notice
Recent Posts
Recent Comments
Link
Β«   2025/03   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
03-11 05:31
관리 메뉴

ImJay

[BOJ/Java] 1981. λ°°μ—΄μ—μ„œ 이동 λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/BOJ - Java

[BOJ/Java] 1981. λ°°μ—΄μ—μ„œ 이동

ImJay 2025. 3. 10. 10:08
λ°˜μ‘ν˜•

πŸ“Œ [BOJ/Java] 1981. λ°°μ—΄μ—μ„œ 이동


πŸ’‘ 문제 해석

N × N 크기의 2차원 배열이 주어진닀.
μ™Όμͺ½ 상단 (0,0)μ—μ„œ μ‹œμž‘ν•˜μ—¬ 였λ₯Έμͺ½ ν•˜λ‹¨ (N-1, N-1)κΉŒμ§€ μ΄λ™ν•˜λŠ” 경둜λ₯Ό μ°Ύμ•„μ•Ό ν•œλ‹€.

πŸ”Ή 이동 쑰건

  • μƒν•˜μ’Œμš° 이동 κ°€λŠ₯
  • 이동 쀑 μ΅œμ†Œκ°’κ³Ό μ΅œλŒ€κ°’μ˜ 차이(max - min)κ°€ μ΅œμ†Œκ°€ λ˜μ–΄μ•Ό ν•œλ‹€.

βœ… λͺ©ν‘œ:
이동 κ²½λ‘œμ—μ„œμ˜ μ΅œμ†Œκ°’κ³Ό μ΅œλŒ€κ°’μ˜ 차이λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 값을 κ΅¬ν•˜λŠ” 것!


πŸ“ 풀이 κ³Όμ •

1️⃣ 이뢄 탐색 + BFS ν™œμš©

βœ” 이뢄 νƒμƒ‰μ˜ λ²”μœ„:

  • λ°°μ—΄μ˜ 값이 0 ~ 200μ΄λ―€λ‘œ μ΅œμ†Œκ°’μ„ μ„€μ •ν•  수 μžˆλŠ” λ²”μœ„λ₯Ό 이뢄 탐색
  • μ΅œμ†Œκ°’μ„ low, μ΅œλŒ€κ°’μ„ high둜 두고 탐색

βœ” BFS둜 경둜 탐색:

  • lowλΆ€ν„° low + μ΅œμ†Œ 차이λ₯Ό λ§Œμ‘±ν•˜λŠ” 값듀을 BFS둜 탐색
  • 이동 κ°€λŠ₯ν•˜λ©΄ mid 값을 쀄이고, λΆˆκ°€λŠ₯ν•˜λ©΄ λŠ˜λ¦°λ‹€

πŸ’» μ½”λ“œ (Java)

import java.util.*;

public class Main {
    static int N;
    static int[][] grid;
    static int minVal = 200, maxVal = 0;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        grid = new int[N][N];

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                grid[i][j] = sc.nextInt();
                minVal = Math.min(minVal, grid[i][j]);
                maxVal = Math.max(maxVal, grid[i][j]);
            }
        }

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

    static int binarySearch() {
        int left = 0, right = maxVal - minVal;
        int result = right;

        while (left <= right) {
            int mid = (left + right) / 2;

            boolean possible = false;
            for (int minNum = minVal; minNum + mid <= maxVal; minNum++) {
                if (bfs(minNum, minNum + mid)) {
                    possible = true;
                    break;
                }
            }

            if (possible) {
                result = mid;
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return result;
    }

    static boolean bfs(int minLimit, int maxLimit) {
        if (grid[0][0] < minLimit || grid[0][0] > maxLimit) return false;

        Queue<int[]> queue = new LinkedList<>();
        boolean[][] visited = new boolean[N][N];
        queue.offer(new int[]{0, 0});
        visited[0][0] = true;

        while (!queue.isEmpty()) {
            int[] cur = queue.poll();
            int x = cur[0], y = cur[1];

            if (x == N - 1 && y == N - 1) return true;

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

                if (nx >= 0 && ny >= 0 && nx < N && ny < N && !visited[nx][ny]) {
                    int nextVal = grid[nx][ny];
                    if (nextVal >= minLimit && nextVal <= maxLimit) {
                        queue.offer(new int[]{nx, ny});
                        visited[nx][ny] = true;
                    }
                }
            }
        }
        return false;
    }
}

⏱ μ‹œκ°„ λ³΅μž‘λ„ 뢄석

  • 이뢄 탐색 λ²”μœ„: 0 ~ 200 (μ΅œλŒ€ 200번 반볡)
  • BFS 탐색: N × N 탐색 (O(N^2))
  • μ΅œμ•…μ˜ 경우 200 × N^2 → 200 × 100^2 = 2,000,000 (μΆ©λΆ„νžˆ κ°€λŠ₯)

🧐 λŠλ‚€ 점

🌟 이뢄 탐색과 BFSλ₯Ό κ²°ν•©ν•œ λ¬Έμ œμ˜€λ‹€.
➑️ 이뢄 νƒμƒ‰μœΌλ‘œ μ΅œμ†Œ-μ΅œλŒ€ λ²”μœ„λ₯Ό μ‘°μ •ν•˜κ³ , BFS둜 탐색 κ°€λŠ₯ μ—¬λΆ€λ₯Ό νŒλ³„ν•˜λŠ” 방식이 ν•΅μ‹¬μ΄μ—ˆλ‹€.
➑️ ν‰μ†Œμ— 이뢄 탐색을 λ‹¨μˆœν•œ μ •λ ¬ λ¬Έμ œμ—μ„œλ§Œ μ‚¬μš©ν–ˆλŠ”λ°, λ²”μœ„λ₯Ό νƒμƒ‰ν•˜λŠ” 데도 μ μš©ν•  수 μžˆλ‹€λŠ” 점이 μ‹ κΈ°ν–ˆλ‹€!

πŸ” λ””ν…ŒμΌν•œ λΆ€λΆ„μ—μ„œ μ‹€μˆ˜ν•˜κΈ° 쉬웠닀.
βœ… μ΅œμ†Œκ°’(minLimit)λΆ€ν„° μ΅œλŒ€κ°’(maxLimit)κΉŒμ§€μ˜ λ²”μœ„λ₯Ό μ‘°μ •ν•˜λŠ” 방식이 μ΅μˆ™ν•˜μ§€ μ•Šμ•„ μ‹œκ°„μ΄ κ±Έλ Έλ‹€.
βœ… BFS 탐색 μ‹œ, μ΄ˆκΈ°κ°’μ΄ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ©΄ μ¦‰μ‹œ false μ²˜λ¦¬ν•˜λŠ” 것이 μ€‘μš”ν–ˆλ‹€.

πŸš€ 이런 μœ ν˜•μ˜ 문제λ₯Ό 많이 μ—°μŠ΅ν•˜λ©΄ 쒋을 것 κ°™λ‹€! 😊

λ°˜μ‘ν˜•
Comments