From 1462ba8a8e438418c0de989344923b52f23c808f Mon Sep 17 00:00:00 2001 From: zinnnn37 Date: Wed, 5 Nov 2025 22:05:06 +0900 Subject: [PATCH] =?UTF-8?q?[20251105]=20PGM=20/=20LV2=20/=20=EB=8F=84?= =?UTF-8?q?=EB=84=9B=EA=B3=BC=20=EB=A7=89=EB=8C=80=20=EA=B7=B8=EB=9E=98?= =?UTF-8?q?=ED=94=84=20/=20=EA=B9=80=EB=AF=BC=EC=A7=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0 \352\267\270\353\236\230\355\224\204.md" | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 "zinnnn37/202511/5 PGM LV2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" diff --git "a/zinnnn37/202511/5 PGM LV2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" "b/zinnnn37/202511/5 PGM LV2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" new file mode 100644 index 00000000..6e4739e5 --- /dev/null +++ "b/zinnnn37/202511/5 PGM LV2 \353\217\204\353\204\233\352\263\274 \353\247\211\353\214\200 \352\267\270\353\236\230\355\224\204.md" @@ -0,0 +1,114 @@ +```java +import java.util.*; + +class Solution { + + private static int maxNode; + private static int[] answer; + private static boolean[] isParent, isChild, visited; + private static Queue q; + + private static Map> graph; + + private static void init(int[][] edges) { + answer = new int[4]; + isParent = new boolean[1000001]; + isChild = new boolean[1000001]; + + graph = new HashMap<>(); + + maxNode = 0; + for (int[] edge : edges) { + List tmp; + + maxNode = Math.max(maxNode, Math.max(edge[0], edge[1])); + + isParent[edge[0]] = true; + isChild[edge[1]] = true; + + if (graph.get(edge[0]) == null) { + tmp = new ArrayList<>(); + } else { + tmp = graph.get(edge[0]); + } + + tmp.add(edge[1]); + graph.put(edge[0], tmp); + } + q = new ArrayDeque<>(); + visited = new boolean[maxNode + 1]; + } + + private static void findRoot() { + for (int i = 0; i <= maxNode; i++) { + if (isParent[i] && !isChild[i]) { + List children = graph.get(i); + + // 나가는 간선이 2개 이상 + if (children != null && children.size() >= 2) { + answer[0] = i; + break; + } + } + } + } + + private static void bfs(int start) { + q.offer(start); + visited[start] = true; + + int nodeCnt = 0; + int edgeCnt = 0; + + while (!q.isEmpty()) { + int cur = q.poll(); + nodeCnt++; + + List children = graph.get(cur); + + // | + if (children == null) { + answer[2]++; + return; + } + + edgeCnt += children.size(); + + // 자식 정점이 2개 이상 - 8 + if (children.size() > 1) { + answer[3]++; + return; + } + + for (int next : children) { + if (visited[next]) { + // 간선 수 == 노드 수 - O + // 간선 수 > 노드 수 - 8자 + if (edgeCnt == nodeCnt) { + answer[1]++; + } else { + answer[3]++; + } + return; + } + + visited[next] = true; + q.offer(next); + } + } + } + + public int[] solution(int[][] edges) { + init(edges); + findRoot(); + + for (int n : graph.get(answer[0])) { + Arrays.fill(visited, false); + bfs(n); + q.clear(); + } + + return answer; + } +} +``` \ No newline at end of file