코테 공부

양궁대회(프로그래머스, 자바)

DaEun_ 2023. 4. 12. 11:51

 

https://school.programmers.co.kr/learn/courses/30/lessons/92342

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

1. 지거나 비기는 경우는 -1리턴

2. 점수의 차가 같은 경우가 여러 경우 있다면

=> 마지막 인덱스부터 차례대로 비교하면서, lPoint 배열값이 후보 배열값보다 크면 break

 

 

class Solution {
	
	static int[] lPoint; //라이언의 화살 목록
    static int diff=0;
    
    public static void main(String[] args) {
  
    	//int info[] = {0, 0, 1, 2, 0, 1, 1, 1, 1, 1, 1};
    	
    	//int info[] = {1,1,2,3,0,2,0,0,0,0,0};
    	int info[] = {1,1,2,0,1,2,2,0,0,0,0};
    	int[] answer=solution(9,info);
    	for(int i=0;i<answer.length;i++) {
    		System.out.print(answer[i]+" ");
    	}System.out.println();
    	
    }
 
    
    public static int[] solution(int n, int[] info) {
        
    	lPoint=new int[info.length];
        
    	int[] point=new int[info.length]; 
    	dfs(info, 0, point, 0, n);
       
        if(diff==0) { //비기거나 지면
            lPoint=new int[1];
            lPoint[0]=-1;
        }
        
        return lPoint;
   
    }
    
    
    static void dfs(int[] info, int idx, int[] answer, int cnt, int n){
      
    	
    	if(cnt==n){ //양궁을 다 쏘았다면
            compareScore(info, answer); //차이값과 쏜 배열값과 비교를 통해 점수 산출 
            return;
        }
 
        if(idx>=info.length) return;
        
        int[] temp=new int[info.length];
        for(int i=0;i<=idx;i++) temp[i]=answer[i];
        temp[idx]++; 
        	
        dfs(info, idx,temp,cnt+1,n );
        
        dfs(info, idx+1, temp, cnt+1,n);
        
        //해당 인덱스의 점수를 포함하지 않는 경우
        dfs(info, idx+1, answer, cnt,n);
        
    }
    
    static void compareScore(int[] info, int[] answer){
       
    	int lScore=0; //라이언 점수
        int aScore=0; //어피치 점수 
        
        for(int i=0;i<info.length;i++){
            if(info[i]< answer[i]) lScore+=(10-i);
            else if(info[i]>0 && info[i]==answer[i])  aScore+=(10-i);
            else if(info[i]>answer[i]) aScore+=(10-i);
            	
        }
        
       if(lScore>=aScore) { 
    	   if(diff<(lScore-aScore)) { //차이값이 더 커지면, lPoint 갱신
    		   diff=lScore-aScore;
    		   for(int j=0;j<11;j++) {
      				lPoint[j]=answer[j];
      			}
    	   }
    	   else if(diff==(lScore-aScore)) { //차이 값이 같다면, 낮은 점수의 양궁점수를 가진 경우 찾기
    		   chooseBest(answer);
    	   }
    	   
       }
       
    }
    
    static void chooseBest(int[] answer) {
        	
    	for(int i=answer.length-1;i>=0;i--) {
    		if(answer[i]>lPoint[i]) {
    			for(int j=0;j<11;j++) {
    				lPoint[j]=answer[j];
    			}
    			break;
    		}
    		else if(answer[i]<lPoint[i]) break; 
    	} 
    }
}