From aa216c15a9758a6946ef48f82c5d531e60b2432d Mon Sep 17 00:00:00 2001 From: asqwklop12 <33236685+asqwklop12@users.noreply.github.com> Date: Wed, 4 Mar 2026 13:03:12 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=8C=EC=9E=84=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Main.java" | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 "pr/\352\262\214\354\236\204\352\260\234\353\260\234/Main.java" diff --git "a/pr/\352\262\214\354\236\204\352\260\234\353\260\234/Main.java" "b/pr/\352\262\214\354\236\204\352\260\234\353\260\234/Main.java" new file mode 100644 index 0000000..15fad0e --- /dev/null +++ "b/pr/\352\262\214\354\236\204\352\260\234\353\260\234/Main.java" @@ -0,0 +1,138 @@ +import java.io.*; +import java.util.*; + +public class Main { + public static void main(String[] args) { + new Main().run(); + } + + public void run() { + FastReader fr = new FastReader(); + int n = Integer.parseInt(fr.next()); + List[] buildingInfo = new ArrayList[n]; + for (int i = 0; i < n; i++) { + buildingInfo[i] = new ArrayList<>(); + while (fr.hasMoreTokens()) { + int val = Integer.parseInt(fr.next()); + buildingInfo[i].add(val); + if (val == -1) + break; + } + } + int[] results = solve(n, buildingInfo); + StringBuilder sb = new StringBuilder(); + for (int res : results) { + sb.append(res).append("\n"); + } + System.out.print(sb.toString()); + } + + static class Building { + int index; + int time; + + List prevBuildings; + + public Building(int index, int time) { + this.index = index; + this.time = time; + this.prevBuildings = new ArrayList<>(); + } + + public void addPrevBuilding(int prevBuilding, int time) { + this.prevBuildings.add(new int[] { prevBuilding, time }); + } + } + + int[] memo; + List buildings = new ArrayList<>(); + + /** + * 문제 해결 메서드 + * + * @param n 건물의 개수 + * @param buildingInfo 각 줄의 정보 (시간, 선행 건물들, -1이 포함된 리스트 배열) + * @return 각 건물이 완성되는 최소 시간 배열 + */ + public int[] solve(int n, List[] buildingInfo) { + // buildingInfo[i]는 {시간, 선행1, 선행2, ..., -1} 형태의 List입니다. + + memo = new int[n]; + Arrays.fill(memo, -1); + buildings = new ArrayList<>(); + + for (int i = 0; i < n; i++) { + buildings.add(new Building(i, buildingInfo[i].get(0))); + + for (int k = 1; k < buildingInfo[i].size(); k++) { + int prevBuilding = buildingInfo[i].get(k); + if (prevBuilding == -1) + break; + buildings.get(i).addPrevBuilding(prevBuilding - 1, buildingInfo[prevBuilding - 1].get(0)); + } + } + + int[] totalTimes = new int[n]; + for (int i = 0; i < n; i++) { + totalTimes[i] = dfs(i); + } + + return totalTimes; + } + + public int dfs(int index) { + if (memo[index] != -1) + return memo[index]; + + int maxPrev = 0; + + for (int[] prev : buildings.get(index).prevBuildings) { + int prevIdx = prev[0]; + maxPrev = Math.max(maxPrev, dfs(prevIdx)); + } + + memo[index] = buildings.get(index).time + maxPrev; + return memo[index]; + } + + static class FastReader { + BufferedReader br; + StringTokenizer st; + + public FastReader() { + br = new BufferedReader(new InputStreamReader(System.in)); + } + + public String next() { + while (st == null || !st.hasMoreElements()) { + try { + st = new StringTokenizer(br.readLine()); + } catch (IOException e) { + } + } + return st.nextToken(); + } + + public int nextInt() { + return Integer.parseInt(next()); + } + + public long nextLong() { + return Long.parseLong(next()); + } + + public boolean hasMoreTokens() { + while (st == null || !st.hasMoreElements()) { + String line = null; + try { + line = br.readLine(); + } catch (IOException e) { + } + if (line == null) + return false; + st = new StringTokenizer(line); + } + return true; + } + } +}