로직 - DFS
위와 같은 상황이 있다고 가정하자.
dfs의 시작은 노드번호 0부터 시작한다.
1 : 0번 방문) next = {1, 8}, 양 = 1, 늑대 = 0
2 : 0-1번 방문) next = {8, 2, 4}, 양 = 2, 늑대 = 0
3 : 0-8번 방문) next = {1, 7, 9}, 양 = 1, 늑대 = 1 -> 하지만 양과 늑대 수가 같아지므로 제외됨.
4 : 0-1-8번 방문) next = {2, 4, 7, 9} 양 = 2, 늑대 = 1
...
즉, 방문마다 다음 방문할 노드로 해당 노드의 자식 노드들은 추가하되, 형제 노드도 추가해주면서 DFS를 돌리는 방식으로 이 문제를 해결할 수 있다.
코드
import java.util.*;
class Solution {
public static int answer = 0;
public static List<List<Integer>> childs = new ArrayList<>();
public static int[] new_info;
public static int solution(int[] info, int[][] edges) {
new_info = info;
for(int i=0; i<info.length; i++){
childs.add(new ArrayList<>());
}
for(int[] edge : edges){
childs.get(edge[0]).add(edge[1]);
}
System.out.println(childs);
List<Integer> next = new ArrayList<>();
next.add(0);
dfs(0, 0, 0, next);
return answer;
}
public static void dfs(int num, int sheep, int wolf, List<Integer> next){
sheep += (new_info[num] == 0) ? 1 : 0;
wolf += (new_info[num] == 1) ? 1 : 0;
if(sheep <= wolf){
return;
}
answer = Math.max(sheep, answer);
List<Integer> new_next = new ArrayList<>();
new_next.addAll(next);
new_next.remove(Integer.valueOf(num));
for(int child : childs.get(num)){
new_next.add(child);
}
for(int new_num : new_next){
dfs(new_num, sheep, wolf, new_next);
}
}
}
'Algorithm > Practice' 카테고리의 다른 글
Programmers - 블록 이동하기 with JAVA (0) | 2023.08.06 |
---|---|
Programmers - 110옮기기 with JAVA (0) | 2023.08.04 |
Programmers - 길 찾기 게임 with JAVA (V) (0) | 2023.07.25 |
Programmers - 외벽점검 with JAVA (V) (0) | 2023.07.25 |
Programmers - 교점에 별 만들기 with JAVA (0) | 2023.07.24 |