From 771ca126aa1a271f6a488dc64903e51847cf1526 Mon Sep 17 00:00:00 2001 From: LiiNi-coder <97495437+LiiNi-coder@users.noreply.github.com> Date: Mon, 26 Jan 2026 23:04:00 +0900 Subject: [PATCH] =?UTF-8?q?[20260126]=20BOJ=20/=20G3=20/=20=EB=82=98?= =?UTF-8?q?=EB=AC=B4=20=EC=9E=AC=ED=85=8C=ED=81=AC=20/=20=EC=9D=B4?= =?UTF-8?q?=EC=9D=B8=ED=9D=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4 \354\236\254\355\205\214\355\201\254.md" | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 "LiiNi-coder/202601/26 BOJ \353\202\230\353\254\264 \354\236\254\355\205\214\355\201\254.md" diff --git "a/LiiNi-coder/202601/26 BOJ \353\202\230\353\254\264 \354\236\254\355\205\214\355\201\254.md" "b/LiiNi-coder/202601/26 BOJ \353\202\230\353\254\264 \354\236\254\355\205\214\355\201\254.md" new file mode 100644 index 00000000..cb374472 --- /dev/null +++ "b/LiiNi-coder/202601/26 BOJ \353\202\230\353\254\264 \354\236\254\355\205\214\355\201\254.md" @@ -0,0 +1,157 @@ +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; +import java.util.TreeSet; + +public class Main{ + // n*n 땅, r c 는 1부터 + // 처음은 모든칸에 양분 5 + // M개의 나무 땅에 + // 한칸에 여러개의 나무 가능 + private static class Tree implements Comparable{ + int year; + Tree(int year){ + this.year = year; + } + + @Override + public int compareTo(Tree o){ + return this.year - o.year; + } + } + + private static int[][] yangbuns; + private static int[][] yangbunDelta; + private static int n; + private static int m; + private static int k; + private static Map> treesAt1D; + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String[] tokens = br.readLine().split(" "); + n = Integer.parseInt(tokens[0] ); + m = Integer.parseInt(tokens[1] ); + k = Integer.parseInt(tokens[2] ); + yangbuns = new int[n][n]; + yangbunDelta = new int[n][n]; + for(int r = 0; r(); + for(int r = 0; r()); + } + } + for(int i = 0; i()); + treesAt1D.get(convert2to1(r, c)).add(new Tree(year)); + } + + for(Map.Entry> entry : treesAt1D.entrySet()){ + int coord1D = entry.getKey(); + int[] temp = convert1to2(coord1D); + int r = temp[0]; int c = temp[1]; + List treeQ = entry.getValue(); + treeQ.sort((o1, o2) -> o1.year - o2.year); + } + + int kk = k; + while(kk-->0){ + // 봄-> 자신의 나이만큼 양분 먹음->나이++, 여러개나무-> 나이가 어린 나무부터 먹음 + Queue yangbunsForSummer = new ArrayDeque(); + Queue yangbunsForFall = new ArrayDeque(); + for(Map.Entry> entry : treesAt1D.entrySet()){ + int coord1D = entry.getKey(); + int[] temp = convert1to2(coord1D); + int r = temp[0]; int c = temp[1]; + List treeQ = entry.getValue(); + Iterator iter = treeQ.iterator(); + boolean shouldRemove = false; + Tree tree = null; + while(iter.hasNext()){ + tree = iter.next(); + if(shouldRemove){ + yangbunsForSummer.add(new int[]{r, c, tree.year/2}); + iter.remove(); + }else{ + yangbuns[r][c]-= tree.year; + if(yangbuns[r][c]<0){ + // 먹었더니 양분 값이 음수 + //원상복귀 + yangbuns[r][c]+= tree.year; + shouldRemove = true; + yangbunsForSummer.add(new int[]{r, c, tree.year/2}); + iter.remove(); + }else{ + tree.year++; + if(tree.year % 5 == 0){ + yangbunsForFall.add(new int[]{r, c}); + } + } + } + } + } + // 만약 양분 부족-> 나무 바로죽음 + // 여름-> 봄에 죽은 나무-> 양분, 죽은 나무 나이/2 값이 추가 + while(!yangbunsForSummer.isEmpty()){ + int[] yangbunInfo = yangbunsForSummer.poll(); + int r = yangbunInfo[0]; int c = yangbunInfo[1]; + yangbuns[r][c]+= yangbunInfo[2]; + } + // 가을-> 나이 5의배수인 나무가 번식 -> 인접한 8개칸에 나이1인 나무생김(바운드고려) + for(int[] coords: yangbunsForFall){ + int r = coords[0]; + int c = coords[1]; + for(int dr = -1; dr <=1; dr++){ + for(int dc = -1; dc <=1; dc++){ + if(dr == 0 && dc == 0) continue; + int nr = r+dr; + int nc = c+dc; + if(nr < 0 || nr >= n || nc < 0 || nc >= n) continue; + treesAt1D.get(convert2to1(nr, nc)).add(0, new Tree(1)); + } + } + } + // 겨울-> 입력으로 해당 땅에 양분추가됨 + for(int r = 0; r> entry : treesAt1D.entrySet()){ + answer += entry.getValue().size(); + } + System.out.println(answer); + br.close(); + } + + private static int[] convert1to2(int coord1D) { + return new int[]{coord1D / n, coord1D % n}; + } + + private static Integer convert2to1(int r, int c) { + return r*n + c; + } +} +```