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

2024. 9. 22. 01:17Algorithm

 

문제 풀이
  1. 0점씩인 경우 생략 (결과 배열 값을 말함)
  2. 어피치가 라이언 보다 점수가 같거나 크면 어피치 승리
  3. 동일한 점수 차이로 승리 경우 수가 많은 경우 가장 작은 점수들로 승리한 경우를 반환

1번 조건의 경우 점수 계산 함수에서 처리 

2번 조건의 경우도 점수 계산 함수에서 처리

3번 조건의 경우 화살 배당시 0점부터 시작해 처리

 

문제 정답

 

class Solution {

    static int[] lion_info, answer;
    static int MAX_SCORE = Integer.MIN_VALUE;
    
    public int[] solution(int n, int[] info) {
        answer = new int[] { -1 };
        
        lion_info = new int[11];
        
        dfs(info, 1, n);
        
        return answer;
    }
    
    static void dfs(int[] info, int arrows, int n) {
        
        if (arrows == n + 1) {
            int apeach_score = 0;
            int lion_score = 0;     
            for (int i = 0; i < 11; i++) {
                
                if (info[i] == 0 && lion_info[i] == 0) continue;
                
                if (info[i] < lion_info[i]) lion_score += 10 - i;
                
                else apeach_score += 10 - i;
            }
            
            // lion_score가 apeach_score보다 크고 MAX_VALUE 보다 크면 갱신
            if (lion_score > apeach_score) {
                if (lion_score - apeach_score >= MAX_SCORE) {
                    MAX_SCORE = lion_score - apeach_score;
                    answer = lion_info.clone();
                }
            }
            return;
        }
        
        // 화살을 쏴 점수 계산
        for (int i = 0; i <= 10 && lion_info[i] <= info[i]; i++) {
            lion_info[i]++;
            dfs(info, arrows + 1, n);
            lion_info[i]--;
        }
        
    }
    
}