From 436ae017987a69df53f76f4a913504be340c1854 Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Wed, 27 Aug 2025 17:53:44 +0900 Subject: [PATCH] =?UTF-8?q?[20250827]=20BOJ=20/=20G3=20/=20=EB=A7=88?= =?UTF-8?q?=EB=9D=BC=ED=86=A4=202=20/=20=EC=9D=B4=EC=A2=85=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\353\247\210\353\235\274\355\206\244 2.md" | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 "0224LJH/202508/27 BOJ \353\247\210\353\235\274\355\206\244 2.md" diff --git "a/0224LJH/202508/27 BOJ \353\247\210\353\235\274\355\206\244 2.md" "b/0224LJH/202508/27 BOJ \353\247\210\353\235\274\355\206\244 2.md" new file mode 100644 index 00000000..3352f1ea --- /dev/null +++ "b/0224LJH/202508/27 BOJ \353\247\210\353\235\274\355\206\244 2.md" @@ -0,0 +1,84 @@ +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.StringTokenizer; + + +public class Main { + + static int checkCnt, skipMaxCnt,ans; + static int[][] dp; //dp[i][j] skip j번하고 i번째 체크포인트에 도달했을 때의 최댓값 + static int[] y; + static int[] x; + + public static void main(String[] args) throws IOException { + init(); + process(); + print(); + } + + public static void init() throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + + checkCnt = Integer.parseInt(st.nextToken()); + skipMaxCnt = Integer.parseInt(st.nextToken()); + dp = new int[checkCnt][skipMaxCnt+1]; + y = new int[checkCnt]; + x = new int[checkCnt]; + + for (int i = 0; i < checkCnt; i++) { + st = new StringTokenizer(br.readLine()); + y[i] = Integer.parseInt(st.nextToken()); + x[i] = Integer.parseInt(st.nextToken()); + + Arrays.fill( dp[i], Integer.MAX_VALUE/2); + } + + + dp[0][0] = 0; + ans = Integer.MAX_VALUE/2; + } + + public static void process() throws IOException { + for (int i = 0; i < checkCnt; i++) { + int curY = y[i]; + int curX = x[i]; + for (int j = 0; j <=skipMaxCnt; j++) { // 이전에 스킵했던 횟수 + for (int k = 0; k <= skipMaxCnt; k++) { // 이번에 스킵하려는 횟수 + int nIdx = i+1+k; + int nSkipCnt = j + k; + + if (nIdx >= checkCnt || nSkipCnt > skipMaxCnt) break; + + int nY = y[nIdx]; + int nX = x[nIdx]; + int plus = Math.abs(curX- nX) + Math.abs(curY - nY); + + dp[nIdx][nSkipCnt] = Math.min(dp[nIdx][nSkipCnt], dp[i][j] + plus); + } + + + + } + } + + for (int i = 0; i <= skipMaxCnt; i++) { + + ans = Math.min(dp[checkCnt-1][i], ans); + } + + } + + + + public static void print() { + System.out.println(ans); + } +} + +```