알고리즘

프로그래머스 양과 늑대 (JAVA)

박카스마시며코딩 2023. 8. 16. 23:13

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

저는 dfs를 이용해 문제를 해결하였습니다.

다른 dfs랑은 조금 다르게 다음에 갈 수 있는 경로를 파라미터로 주었습니다. 

갔던 곳을 또 갈 수 있지만, 그때 양과 늑대가 카운터되지 않기 때문에 위와 같이 구현하였습니다.

 

import java.util.*;

class Solution {
    private static final int WOLF = 1;
    private static final int SHEEP = 0;
    public int solution(int[] info, int[][] edges) {
        int size = info.length;
        List<Integer>[] map = new List[size];
        for(int i = 0 ; i < size ; i++){
            map[i] = new ArrayList<>();
        }
        for(int[] edge : edges){
            int start = edge[0];
            int end = edge[1];
            map[start].add(end);
        }
        int answer = cal(0,0,0,info,map,new ArrayList<>());
        return answer;
    }
    private static int cal(int now,int sheep,int wolf,int[] info, List<Integer>[] map, List<Integer> list){
        if(info[now] == SHEEP){
            sheep++;
        }else{
            wolf++;
        }
        if(wolf >= sheep){
            return 0;
        }
        int result = sheep;
        List<Integer> temp = new ArrayList<>();
        for(int next : map[now]){
            temp.add(next);
        }
        for(int next : list){
            if(next == now){
                continue;
            }
            temp.add(next);
        }
        for(int next : temp){
            result = Math.max(result,cal(next,sheep,wolf,info,map,temp));
        }
        return result;
    }
}