[프로그래머스] 양과 늑대 - JAVA

https://school.programmers.co.kr/learn/courses/30/lessons/92343

풀이

늑대의 수가 양의 수 이상이 되면 양들이 다 잡아먹혀서 안된다.

트리의 0번부터 시작해서 양을 늑대보다 많게 하면서 돌아다닌다. 이때 양의 최댓값을 찾아야한다.

이동이 가능한 노드들을 담는 리스트를 만들었다. 특정 노드를 방문 할 때 그 노드의 자식 노드를 리스트에 담고, 해당 노드는 제거해주었다.

이동가능한 리스트를 들고 dfs탐색을 통해 최댓값을 갱신했다.

리스트에서 노드를 제거할 때 ConcurrentModificationException 때문에 고생한 문제였다.

관련글 : ConcurrentModificationException


메모리: 70.6MB

시간: 4.22ms

언어: Java 11

코드

import java.util.*;
import java.util.stream.*;

class Solution {
    static int answer;
    public int solution(int[] info, int[][] edges) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        for(int i = 0; i < info.length; i++) {
            list.add(new ArrayList<>());
        }
        for(int i = 0; i < edges.length; i++) {
            list.get(edges[i][0]).add(edges[i][1]);
        }

        List<Integer> possibleNext = new ArrayList<>();
        possibleNext.add(0);

        answer = 0;
        dfs(0, possibleNext, list, info, 0, 0);

        return answer;
    }

    private static void dfs(int node, List<Integer> possibleNext, ArrayList<ArrayList<Integer>> list, int[] info, int sheep, int wolf) {
        if(info[node] == 0) {
            sheep++;
        }else {
            wolf++;
        }

        if(sheep <= wolf) {
            return;
        }

        answer = Math.max(answer, sheep);

        possibleNext = possibleNext.stream()
            .filter(item -> item != node)
            .collect(Collectors.toList());

        for(int nextNode : list.get(node)) {
            possibleNext.add(nextNode);
        }

        for(int next : possibleNext) {
            dfs(next, possibleNext, list, info, sheep, wolf);
        }
    }
}