[ 프로그래머스 ] #92342 : 양궁대회 - JAVA

🔗양궁대회

import java.util.*;

class Solution {

    public int[] solution(int n, int[] info) {
        int[] ryan = new int[11];
        int[] best = null;

        best = dfs(0, n, info, ryan, best);

        if (best == null) return new int[]{-1};
        return best;
    }

    private int[] dfs(int idx, int remain, int[] info,
                      int[] ryan, int[] best) {

        // 마지막(0점)
        if (idx == 10) {
            ryan[10] += remain;
            best = updateBest(info, ryan, best);
            ryan[10] -= remain;
            return best;
        }

        // 1) 이기는 경우
        int need = info[idx] + 1;
        if (remain >= need) {
            ryan[idx] = need;
            best = dfs(idx + 1, remain - need, info, ryan, best);
            ryan[idx] = 0;
        }

        // 2) 포기
        best = dfs(idx + 1, remain, info, ryan, best);

        return best;
    }

    // best 갱신 로직
    private int[] updateBest(int[] info, int[] ryan, int[] best) {

        int diff = calcDiff(info, ryan); // 현재 계산한 값의 점수차
        if (diff <= 0) return best; // 어피치 점수가 더 클 때

        if (best == null) return Arrays.copyOf(ryan, 11); // 기존 점수가 없을때

        int bestDiff = calcDiff(info, best); // 기존 best의 점수차 계산
        if (diff > bestDiff) return Arrays.copyOf(ryan, 11); // 현재 점수차가 더 클 때

        if (diff == bestDiff && isBetter(ryan, best)) { // 같을 때, 가장 낮은 점수를 더 많이 맞힌 경우 return
            return Arrays.copyOf(ryan, 11);
        }

        return best;
    }

    // 점수차 계산
    private int calcDiff(int[] info, int[] arr) {
        int r = 0, a = 0;
        for (int i = 0; i < 11; i++) {
            int point = 10 - i;
            if (info[i] == 0 && arr[i] == 0) continue;
            if (arr[i] > info[i]) r += point;
            else a += point;
        }
        return r - a;
    }

    // 낮은 점수 우선 비교
    private boolean isBetter(int[] cand, int[] best) {
        for (int i = 10; i >= 0; i--) {
            if (cand[i] != best[i]) {
                return cand[i] > best[i]; // 낮은 점수가 더 많은지 아닌지
            }
        }
        return false;
    }
}