programmers_양궁대회_java

2023. 5. 29. 12:01Algorithm/Programmers

728x90

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

 

프로그래머스

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

programmers.co.kr

class Solution {
    private static int[] hit;
    private static int diff;
    private static boolean end;

    public int[] solution(int n, int[] info) {
        int[] answer = {};
        hit = new int[11];
        end = false;
        diff = 0;
        dfs(n, info, 10, 0, 0, new int[11]);

        if (end){
            answer = hit;
        }else {
            answer = new int[]{-1};
        }

        return answer;
    }

// 완전탐색
    public void dfs(int n, int[] info, int point, int apeachPoint, int ryanPoint, int[] tt){
        if (point == 0){
            if (apeachPoint < ryanPoint){
                if (n > 0){
                    tt[10 - point] = n;
                }
                if (diff < ryanPoint - apeachPoint){ // 점수차가 더 큰 경우
                    diff = ryanPoint - apeachPoint;
                    hit = copy(tt);
                }else if(diff == ryanPoint - apeachPoint){
                    if (!comepare(hit, tt)){ // 더 적은 점수를 많이 맞춘 우
                        hit = copy(tt);
                    }
                }

                end = true;
            }
            tt[10 - point] = 0;
            return;
        }

        // 어피치가 해당 점수를 갖는 경우
        if(info[10 - point] > 0){
            tt[10 - point] = 0;
            dfs(n, info, point - 1, apeachPoint + point, ryanPoint, tt);
        }else{ // 둘다 점수를 갖지 않는 경우
            tt[10 - point] = 0;
            dfs(n, info, point - 1, apeachPoint, ryanPoint, tt);
        }
        // 라이언이 해당 점수를 갖는 경우
        if(n - info[10 - point] -1 >= 0){
            tt[10 - point] = info[10 - point] + 1;
            dfs(n - info[10 - point] - 1, info, point - 1, apeachPoint, ryanPoint + point, tt);
        }
    }

// 적은 점수에 많이 맞춘 것 찾기
    public boolean comepare(int[] oriArr, int[] newArr){
        for (int i = 10; i>=0; i--){
            if (oriArr[i] < newArr[i]){
                return false;
            } else if (oriArr[i] > newArr[i]) {
                return true;
            }
        }
        return true;
    }
    
// 배열 복사
    public int[] copy(int[] arr){
        int[] newArr = new int[arr.length];
        for (int i = 0; i<arr.length; i++){
            newArr[i] = arr[i];
        }
        return newArr;
    }
}