From 942720b340b2c34f2347e39dd80e3552163b2555 Mon Sep 17 00:00:00 2001 From: Ukj0ng <90972240+Ukj0ng@users.noreply.github.com> Date: Fri, 21 Nov 2025 22:59:37 +0900 Subject: [PATCH] =?UTF-8?q?[20251121]=20BOJ=20/=20P5=20/=20=EB=B0=B0?= =?UTF-8?q?=EC=97=B4=EC=97=90=EC=84=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\354\204\234 \354\235\264\353\217\231.md" | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 "Ukj0ng/202511/21 BOJ P5 \353\260\260\354\227\264\354\227\220\354\204\234 \354\235\264\353\217\231.md" diff --git "a/Ukj0ng/202511/21 BOJ P5 \353\260\260\354\227\264\354\227\220\354\204\234 \354\235\264\353\217\231.md" "b/Ukj0ng/202511/21 BOJ P5 \353\260\260\354\227\264\354\227\220\354\204\234 \354\235\264\353\217\231.md" new file mode 100644 index 00000000..18d3e56c --- /dev/null +++ "b/Ukj0ng/202511/21 BOJ P5 \353\260\260\354\227\264\354\227\220\354\204\234 \354\235\264\353\217\231.md" @@ -0,0 +1,108 @@ +``` +import java.io.*; +import java.util.*; + +public class Main { + private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + private static final int[] dx = {1, 0, -1, 0}; + private static final int[] dy = {0, 1, 0, -1}; + private static int[][] arr; + private static boolean[][] visited; + private static int N, max, min; + public static void main(String[] args) throws IOException { + init(); + + int answer = binarySearch(); + + bw.write(answer + "\n"); + bw.flush(); + bw.close(); + br.close(); + } + + private static void init() throws IOException { + N = Integer.parseInt(br.readLine()); + max = -1; + min = 201; + + arr = new int[N][N]; + visited = new boolean[N][N]; + + for (int i = 0; i < N; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + + for (int j = 0; j < N; j++) { + arr[i][j] = Integer.parseInt(st.nextToken()); + max = Math.max(max, arr[i][j]); + min = Math.min(min, arr[i][j]); + } + } + } + + private static int binarySearch() { + int left = 0; + int right = 200; + int result = 200; + + while (left <= right) { + int mid = left + (right - left) / 2; + + if (valid(mid)) { + result = mid; + right = mid-1; + } else { + left = mid+1; + } + } + + return result; + } + + private static boolean valid(int diff) { + for (int i = min; i <= max; i++) { + int temp = i + diff; + + if (arr[0][0] < i || arr[0][0] > temp || arr[N-1][N-1] < i || arr[N-1][N-1] > temp) continue; + + if (canReach(i, temp)) { + return true; + } + } + + return false; + } + + private static boolean canReach(int min, int max) { + Queue q = new ArrayDeque<>(); + for (int i = 0; i < N; i++) { + Arrays.fill(visited[i], false); + } + visited[0][0] = true; + q.add(new int[]{0, 0}); + + while (!q.isEmpty()) { + int[] current = q.poll(); + + if (current[0] == N-1 && current[1] == N-1) { + return true; + } + + for (int i = 0; i < 4; i++) { + int nx = current[0] + dx[i]; + int ny = current[1] + dy[i]; + + if (OOB(nx, ny) || arr[nx][ny] > max || arr[nx][ny] < min || visited[nx][ny]) continue; + visited[nx][ny] = true; + q.add(new int[] {nx, ny}); + } + } + + return false; + } + + private static boolean OOB(int nx, int ny) { + return nx < 0 || nx > N-1 || ny < 0 || ny > N-1; + } +} +```