From 5e9bdd33eea188a092944bf9ec61812d86d82087 Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Tue, 7 Apr 2026 14:24:29 +0900 Subject: [PATCH] =?UTF-8?q?[Week14]=20PGS=2092343:=20=EC=96=91=EA=B3=BC?= =?UTF-8?q?=EB=8A=91=EB=8C=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sukangpunch.java" | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 "weekly/week14/PGS_92343_\354\226\221\352\263\274\353\212\221\353\214\200/sukangpunch.java" diff --git "a/weekly/week14/PGS_92343_\354\226\221\352\263\274\353\212\221\353\214\200/sukangpunch.java" "b/weekly/week14/PGS_92343_\354\226\221\352\263\274\353\212\221\353\214\200/sukangpunch.java" new file mode 100644 index 0000000..76d2efa --- /dev/null +++ "b/weekly/week14/PGS_92343_\354\226\221\352\263\274\353\212\221\353\214\200/sukangpunch.java" @@ -0,0 +1,66 @@ +// 양과늑대 +// 백트래킹 +/** + * 어려워서 ai 활용 + * ArrayList로 이진 트리를 구성하여, 해당 노드의 자식들을 간편하게 접근할 수 있도록 함. + * backtrack 내부에선 currentIdx 를 기반으로 양인지, 늑대인지 구분하고 값을 증가시킨다. + * 만약 늑대가 더 많아진다면 가지치기(return) + * 그 다음 result를 업데이트(양 개수) + * 다음 탐색은 현재 노드 기반 자식 노드들을 찾고, 찾은 자식들에 대해 백트래킹을 진행 + * 현재 가능한 방향으로만 backtrack 함수를 호출하기 때문에 visited 배열 불필요 + */ +public class PGS_92343 { + class Solution { + + static int result; + static List[] tree; + + public int solution(int[] info, int[][] edges) { + result = 0; + int n = info.length; + tree = new ArrayList[n]; + + for(int i=0; i(); + } + + for(int[] edge: edges){ + tree[edge[0]].add(edge[1]); + } + + List nextNodes = new ArrayList<>(); + nextNodes.add(0); + + backtrack(0, 0, 0, nextNodes, info); + + return result; + } + + private void backtrack(int currIdx, int sheep, int wolf, List nextNodes, int[] info) { + if(info[currIdx] == 0){ + sheep++; + }else{ + wolf++; + } + + // 늑대가 양과 같거나 많아지면 탐색 종료 + if(wolf >= sheep)return; + + result = Math.max(result, sheep); + + // 다음으로 갈 수 있는 노드 목록 업데이트 (현재 노드는 제외, 현재 노드의 자식들은 추가) + List list = new ArrayList<>(nextNodes); + // remove(Object o) 형식이여야, o 에 해당하는 "값" 을 찾아 지운다. + list.remove(Integer.valueOf(currIdx)); + + for(int child : tree[currIdx]){ + list.add(child); + } + + for(int next : list){ + backtrack(next, sheep, wolf, list, info); + } + + } + } +}