[프로그래머스/java] 양궁대회

somyeong·2022년 10월 31일
0

코테 스터디

목록 보기
35/52

문제 링크 - https://school.programmers.co.kr/learn/courses/30/lessons/92342

🌱 문제


🌱 풀이

  • 조금 복잡한 문제였지만 문제에서 요구하는대로 천천히 구현하고, 예외 케이스를 잘 고려하면 되는 문제였다.
  • 먼저 중복조합으로 라이언이 과녁을 맞히는 경우를 전부 고려하고, 각각의 케이스 마다 어피치와 라이언의 점수를 계산하여 결과를 살펴보고 정답 배열을 갱신해주면 된다.
  • 이것저것 구현을 해야하는 문제라 자세한 풀이는 주석에 작성하였다.

🌱 코드

import java.util.*;

class Solution {
    int lion[] = new int[11];
    int N;
    int apeach[];
    boolean impossible;
    int maxDiff=1; // 0으로해서 헤맸음 
    int[] answer;
    int totalCnt;
    
    public int[] solution(int n, int[] info) {
        N=n;
       
        apeach=info;
        impossible=true; // 라이언이 우승할 방법이 없으면 true;
        int answer2[]={-1}; // 라이언이 우승할 방법이 없을 때 리턴할 정답 배열 
        answer = new int[11];
        
        duplComb(0,0);
        
        // System.out.println("totalCnt: "+totalCnt);
        if(impossible) // 라이언이 우승할 방법 없으면 -1만들어있는 배열이 답
            return answer2;
        else // 라이언이 우승할 방법 있으면 라이언의 점수배열이 답
            return answer;
        
    }
    
    public void duplComb(int cnt, int start){ // 중복조합 
        if(cnt==N){
            // totalCnt++;
            calculate(); 
            return;
        }
        
        for(int i=start; i<11; i++){ // 중복조합 구현 부분
            lion[i]++;
            duplComb(cnt+1,i);
            lion[i]--;
        }
    }
    
    public void calculate(){ // 라이언과 어피치의 점수 합 계산해서 승부 결정 
        int apeachScore=0;
        int lionScore=0;
        for(int i=0; i<11; i++){
            if(apeach[i]>0 && apeach[i]>=lion[i]){ // 각 과녁에서 화살 갯수가 같거나 어피치가 많이 맞혔으면 점수 어피치가 점수 획득 (어피치가 1개이상 맞췄을때만 '같거나'가 성립하므로 해당 조건 필요)
                apeachScore+=(10-i);
            }else if(lion[i]>apeach[i]){ // 라이언은 더 과녁에 더 많이 맞췄을때만 점수 획득 
                lionScore+=(10-i);
            }
        }
        if(lionScore-apeachScore>maxDiff){ // 이전 차이보다 클 경우 
            maxDiff=lionScore-apeachScore;
            if(impossible)
                impossible=false; // 라이언이 이길 방법이 있다는 것을 체크 
            answer=lion.clone();
        }
        else if(lionScore-apeachScore==maxDiff){ // 이전 점수값 차이와 현재 확인하는 점수값 차이가 같을 경우
            if(impossible)
                impossible=false;
            
            boolean flag=false; 
            
            // 낮은 점수를 더 많이 맞힌 경우가 정답배열이 된다.
            for(int i=10; i>=0; i--){
                if(lion[i]<answer[i])
                    break;
                
                if(lion[i]>answer[i]){
                    flag=true;
                    break;
                }
            }
            if(flag)
                answer=lion.clone(); // 배열 복사해서 정답배열에 저장
            
        }
    }
    
    
}
profile
공부한 내용 잊어버리지 않게 기록하는 공간!

0개의 댓글