알고리즘

[Lv_2] 양궁대회

deedee2 2023. 10. 12. 00:38
728x90

🔍 아이디어

✔️ 각 점수별 점수 획득 조합 계산

✔️ 계산된 조합별 점수 차를 계산하고 디테일한 조건을 맞춰준다

     - 최대 점수 차로 승리해야한다.

     - 점수 차가 동일하다면 낮은 점수의 과녁을 많이 맞춘 경우의 수를 반환한다.

     - 이길 수가 없다면 _!-1!_ 로 반환한다.

import java.util.*;

class Solution {
    static List<int[]> permu = new ArrayList<>();
    
    public int[] solution(int n, int[] info) {
        int[] answer = {};
        int[] bucket = new int[11];
        int[] maxArr = new int[11];
        int maxGap = 0;
    
        getCombination(0, bucket);
        
        for (int[] p : permu) {
            int arrows = n;
            
            int r_sco = 0;
            int a_sco = 0;
            
            int[] arr = new int[11];
            
            for (int i = 0; i < p.length; i++) {
                int isWin = p[i];
                int score = 10 - i;
                
                if (arrows - (info[i] + 1) >= 0 && isWin > 0) {
                    arrows -= (info[i] + 1);
                    r_sco += score;
                    arr[i] = info[i] + 1;
                } else {
                    if (info[i] > 0) {
                        a_sco += score;
                    }
                }
            }
            
            if (arrows > 0) {
                arr[10] = arrows;
            }
                        
            int gap = r_sco - a_sco;
                    
            if (gap == maxGap) {
                for (int i = 10; i > -1; i--) {
                    if (arr[i] > maxArr[i]) {
                        maxGap = gap;
                        maxArr = arr;
                        break;
                    } else if (arr[i] < maxArr[i]) {
                        break;
                    }
                }
            } else if (gap > maxGap) {
                maxGap = gap;
                maxArr = arr;
            }
        }
        
        if (maxGap == 0) {
            maxArr = new int[] { -1 };
        }
                
        return maxArr;
    }
    
    void getCombination(int level, int[] arr) {
        if (level == 11) {
            // 모든 배열을 채우면
            permu.add(arr);
            return;
        }
        
        getCombination(level + 1, arr.clone());
        arr[level] = 1;
        getCombination(level + 1, arr.clone());
    }
}

✔️ 링크: 코딩테스트 연습 - 양궁대회 | 프로그래머스 스쿨 (programmers.co.kr)