From 8c4536453884d6d8cf19e266f90ce8d605e2a1aa Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:26:21 +0900 Subject: [PATCH] =?UTF-8?q?[20251212]=20BOJ=20/=20P5=20/=20=EC=9A=B8?= =?UTF-8?q?=ED=83=80=EB=A6=AC=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 --- ...J \354\232\270\355\203\200\353\246\254.md" | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 "0224LJH/202512/12 BOJ \354\232\270\355\203\200\353\246\254.md" diff --git "a/0224LJH/202512/12 BOJ \354\232\270\355\203\200\353\246\254.md" "b/0224LJH/202512/12 BOJ \354\232\270\355\203\200\353\246\254.md" new file mode 100644 index 00000000..5dd60a0c --- /dev/null +++ "b/0224LJH/202512/12 BOJ \354\232\270\355\203\200\353\246\254.md" @@ -0,0 +1,111 @@ +```java +import java.util.*; +import java.io.*; + +public class Main { + + static int treeCnt, ans; + static Tree[] trees; + static Tree[] sortedByX; + static Tree[] sortedByY; + + static class Tree { + int y, x, cost; + + public Tree(int y, int x, int cost) { + this.y = y; + this.x = x; + this.cost = cost; + } + } + + public static void main(String[] args) throws IOException { + init(); + process(); + print(); + } + + private static void init() throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + treeCnt = Integer.parseInt(br.readLine()); + trees = new Tree[treeCnt]; + ans = treeCnt-1; + + for (int i = 0; i < treeCnt; i++) { + StringTokenizer st = new StringTokenizer(br.readLine()); + int x = Integer.parseInt(st.nextToken()); + int y = Integer.parseInt(st.nextToken()); + int cost = Integer.parseInt(st.nextToken()); + trees[i] = new Tree(y, x, cost); + } + + // x 기준 정렬 + sortedByX = Arrays.copyOf(trees, treeCnt); + Arrays.sort(sortedByX, (a, b) -> a.x - b.x); + + // y 기준 정렬 + sortedByY = Arrays.copyOf(trees, treeCnt); + Arrays.sort(sortedByY, (a, b) -> a.y - b.y); + } + + private static void process() { + // 모든 가능한 직사각형에 대해 시도 + for (int i = 0; i < treeCnt; i++) { + for (int j = i; j < treeCnt; j++) { + for (int k = 0; k < treeCnt; k++) { + for (int l = k; l < treeCnt; l++) { + int minX = sortedByX[i].x; + int maxX = sortedByX[j].x; + int minY = sortedByY[k].y; + int maxY = sortedByY[l].y; + + checkRectangle(minX, maxX, minY, maxY); + } + } + } + } + } + + private static void checkRectangle(int minX, int maxX, int minY, int maxY) { + // 둘레 계산 + int width = maxX - minX; + int height = maxY - minY; + int perimeter = (width + height) * 2; + + // 직사각형 내부의 나무들 찾기 + List insideCosts = new ArrayList<>(); + int sum = 0; + int cutCount = 0; + for (int i = 0; i < treeCnt; i++) { + if (trees[i].x >= minX && trees[i].x <= maxX && + trees[i].y >= minY && trees[i].y <= maxY) { + insideCosts.add(trees[i].cost); + } else { + sum += trees[i].cost; + cutCount++; + } + } + + if (sum >= perimeter) { + ans = Math.min(ans, cutCount); + return; + } + + // cost 큰 순으로 정렬 + Collections.sort(insideCosts, Collections.reverseOrder()); + + for (int cost : insideCosts) { + sum += cost; + cutCount++; + if (sum >= perimeter) { + ans = Math.min(ans, cutCount); + break; + } + } + } + + private static void print() { + System.out.println(ans); + } +} +```