프로그래머스 - 양궁대회

‍서지오·2023년 7월 25일
0

코딩 테스트

목록 보기
12/19
post-thumbnail

풀이 방법✏️

  1. 중복 조합을 활용한 완전 탐색을 통해 라이언이 n 번의 라운드 동안 몇 점을 맞췄는 지 결정
  2. 어피치와 라이언이 총 획득한 점수 계산
  3. 라이언이 더 많은 점수를 얻은 경우들 중 점수 차이가 최대인 경우를 구

소스 코드(feat. 알찬 주석)⌨️

import java.util.*;

class Solution {
    static int[] points;
    static int N, R, isWin, maxDiff;
    static int[] answer;
        
    public int[] solution(int n, int[] info) {
        N = 11;        
        R = n;
        points = new int[R];
        answer = new int[N];
        
        combination(0, 0, info);
        
        if(isWin == 0) {
            return new int[]{-1};
        }
        
        return answer;
    }
    
    private static void combination(int cnt, int start, int[] info) { // 중복 조합
        if(cnt == R) {
            calWinner(info);
            return;
        }    
        
        for(int i=start; i<N; i++) {
            points[cnt] = i;
            combination(cnt+1, i, info);
            points[cnt] = 0;
        }
    }
    
    private static void calWinner(int[] apeachInfo) {
        int apeach = 0;
        int ryan = 0;
        
        int[] ryanInfo = new int[N]; // 라이언 점수 정보 저장
        for(int i=0; i<R; i++) {
            ryanInfo[10 - points[i]]++;
        }
        
        for(int i = 0; i<N; i++) {
            if(apeachInfo[i] == 0 && ryanInfo[i] == 0) { // 모두 못 맞춘 경우
                continue;
            }
            
            if(apeachInfo[i] >= ryanInfo[i]) { // 어피치가 점수를 획득하는 경우
                apeach += 10 - i;
                continue;
            }
            
            if(apeachInfo[i] < ryanInfo[i]) { // 라이언이 점수를 획득하는 경우
                ryan += 10 - i;
            }
        }
        
        int diff = ryan - apeach; // 둘의 점수 차이
        
        if(diff > maxDiff) { // 라이언이 이전 보다 더 큰 차이로 이긴 경우
            isWin = 1;
            answer = ryanInfo;
            maxDiff = diff;
        }
    }
    
}
profile
백엔드 개발자를 꿈꾸는 학생입니다!

0개의 댓글

관련 채용 정보