From dad3c69c369d88854f668833aa955fd475c53bde Mon Sep 17 00:00:00 2001 From: sehee <132613722+sae2say@users.noreply.github.com> Date: Sun, 7 Dec 2025 18:01:55 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EB=81=9D=EB=A7=90=EC=9E=87=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\353\247\220\354\236\207\352\270\260.java" | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 "Seahee/week6/\353\201\235\353\247\220\354\236\207\352\270\260.java" diff --git "a/Seahee/week6/\353\201\235\353\247\220\354\236\207\352\270\260.java" "b/Seahee/week6/\353\201\235\353\247\220\354\236\207\352\270\260.java" new file mode 100644 index 0000000..5b3b35e --- /dev/null +++ "b/Seahee/week6/\353\201\235\353\247\220\354\236\207\352\270\260.java" @@ -0,0 +1,44 @@ +import java.util.ArrayList; +import java.util.List; + +class Solution { + public int[] solution(int n, String[] words) { + + List usedWord = new ArrayList<>(); + char lastAlpha = 0; // 이전 단어의 마지막 글자 + int failedSeq = 0; // 몇 번째 단어에서 실패했는지 + + for (int i = 0; i < words.length; i++) { + String word = words[i]; + + // 이미 나온 단어인지 검사 + if (usedWord.contains(word)) { + failedSeq = i + 1; + break; + } + + // 이전 단어의 마지막 글자로 시작하는지 검사 + if (i > 0) { // 첫 번째 글자인 경우 제외 + if (lastAlpha != word.charAt(0)) { + failedSeq = i + 1; + break; + } + } + + usedWord.add(word); + lastAlpha = word.charAt(word.length() - 1); + } + + if (failedSeq == 0) { + return new int[]{0, 0}; + } + + // failedSeq번째 단어를 말한 사람과 그 사람의 차례 계산 + int person = failedSeq % n; + if (person == 0) person = n; + + int turn = (failedSeq - 1) / n + 1; // 몇 번째 차례인지 (라운드) + + return new int[]{person, turn}; + } +} From f6afa2085313271cba98bab5f970305543d0e740 Mon Sep 17 00:00:00 2001 From: sehee <132613722+sae2say@users.noreply.github.com> Date: Sun, 7 Dec 2025 18:10:21 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EB=81=9D=EB=A7=90=EC=9E=87=EA=B8=B0=5F?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...3\201\235\353\247\220\354\236\207\352\270\260.java" | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git "a/Seahee/week6/\353\201\235\353\247\220\354\236\207\352\270\260.java" "b/Seahee/week6/\353\201\235\353\247\220\354\236\207\352\270\260.java" index 5b3b35e..fb665ec 100644 --- "a/Seahee/week6/\353\201\235\353\247\220\354\236\207\352\270\260.java" +++ "b/Seahee/week6/\353\201\235\353\247\220\354\236\207\352\270\260.java" @@ -1,10 +1,10 @@ -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; class Solution { public int[] solution(int n, String[] words) { - List usedWord = new ArrayList<>(); + Set usedWord = new HashSet<>(); char lastAlpha = 0; // 이전 단어의 마지막 글자 int failedSeq = 0; // 몇 번째 단어에서 실패했는지 @@ -18,11 +18,9 @@ public int[] solution(int n, String[] words) { } // 이전 단어의 마지막 글자로 시작하는지 검사 - if (i > 0) { // 첫 번째 글자인 경우 제외 - if (lastAlpha != word.charAt(0)) { + if (i > 0 && lastAlpha != word.charAt(0)) { // 첫 번째 글자인 경우 제외 { failedSeq = i + 1; break; - } } usedWord.add(word); From 86897852957d6e6d611dacd2ec6a9c2d9de7ab90 Mon Sep 17 00:00:00 2001 From: sehee <132613722+sae2say@users.noreply.github.com> Date: Sun, 7 Dec 2025 18:44:33 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=EC=96=91=EA=B3=BC=EB=8A=91=EB=8C=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\352\263\274\353\212\221\353\214\200.java" | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 "Seahee/week6/\354\226\221\352\263\274\353\212\221\353\214\200.java" diff --git "a/Seahee/week6/\354\226\221\352\263\274\353\212\221\353\214\200.java" "b/Seahee/week6/\354\226\221\352\263\274\353\212\221\353\214\200.java" new file mode 100644 index 0000000..b92d4bd --- /dev/null +++ "b/Seahee/week6/\354\226\221\352\263\274\353\212\221\353\214\200.java" @@ -0,0 +1,77 @@ +/* +dfs 한 번 호출 시 O(N^2) +dfs 호출 수 O(2^N) +=> O(N^2 x 2^N) +*/ + +import java.util.ArrayList; +import java.util.List; + +class Solution { + + private List[] children; // 각 노드의 자식 리스트 + private int maxSheep = 0; + + public int solution(int[] info, int[][] edges) { + int n = info.length; + + // 자식 리스트 초기화 + children = new ArrayList[n]; + for (int i = 0; i < n; i++) { + children[i] = new ArrayList<>(); + } + + // 트리 구성 (부모 -> 자식) + for (int[] edge : edges) { + int parent = edge[0]; + int child = edge[1]; + children[parent].add(child); + } + + int sheep = 1; + int wolf = 0; + + // 처음에 갈 수 있는 후보 노드들 (루트의 자식들) + List nextNodes = new ArrayList<>(); + nextNodes.addAll(children[0]); + + dfs(info, sheep, wolf, nextNodes); + + return maxSheep; + } + + private void dfs(int[] info, int sheep, int wolf, List nextNodes) { + // 현재 상태에서 모은 양 수로 최대값 갱신 + maxSheep = Math.max(maxSheep, sheep); + + // 다음에 갈 수 있는 후보 노드들 중 하나를 선택해 보면서 완전 탐색 + for (int i = 0; i < nextNodes.size(); i++) { + int node = nextNodes.get(i); + + int nextSheep = sheep; //다음 dfs에서의 양, 늑대 수 + int nextWolf = wolf; + + // 현재 노드가 양인지 늑대인지에 따라 카운트 증가 + if (info[node] == 0) { + nextSheep++; + } else { + nextWolf++; + } + + // 늑대 수가 양 수 이상이면 이 경로는 더 진행 불가 + if (nextWolf >= nextSheep) { + continue; + } + + // 다음 후보 리스트 생성 + // - 현재 선택한 노드는 후보에서 제거 + // - 현재 노드의 자식들을 새 후보에 추가 + List newNextNodes = new ArrayList<>(nextNodes); + newNextNodes.remove(i); // 현재 방문한 노드는 후보에서 제거 + newNextNodes.addAll(children[node]); // 자식들 추가 + + // 다음 상태로 DFS + dfs(info, nextSheep, nextWolf, newNextNodes); + } + } +}