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

유존돌돌이·2022년 1월 18일
0

Programmers

목록 보기
149/167
post-thumbnail

문제 설명

카카오배 양궁대회가 열렸습니다.
라이언은 저번 카카오배 양궁대회 우승자이고 이번 대회에도 결승전까지 올라왔습니다. 결승전 상대는 어피치입니다.
카카오배 양궁대회 운영위원회는 한 선수의 연속 우승보다는 다양한 선수들이 양궁대회에서 우승하기를 원합니다.

화살의 개수를 담은 자연수 n, 어피치가 맞힌 과녁 점수의 개수를 10점부터 0점까지 순서대로 담은 정수 배열 info가 매개변수로 주어집니다. 이때, 라이언이 가장 큰 점수 차이로 우승하기 위해 n발의 화살을 어떤 과녁 점수에 맞혀야 하는지를 10점부터 0점까지 순서대로 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요. 만약, 라이언이 우승할 수 없는 경우(무조건 지거나 비기는 경우)는 [-1]을 return 해주세요.

제한사항

1 ≤ n ≤ 10
info의 길이 = 11
0 ≤ info의 원소 ≤ n
info의 원소 총합 = n
info의 i번째 원소는 과녁의 10 - i 점을 맞힌 화살 개수입니다. ( i는 0~10 사이의 정수입니다.)
라이언이 우승할 방법이 있는 경우, return 할 정수 배열의 길이는 11입니다.
0 ≤ return할 정수 배열의 원소 ≤ n
return할 정수 배열의 원소 총합 = n (꼭 n발을 다 쏴야 합니다.)
return할 정수 배열의 i번째 원소는 과녁의 10 - i 점을 맞힌 화살 개수입니다. ( i는 0~10 사이의 정수입니다.)
라이언이 가장 큰 점수 차이로 우승할 수 있는 방법이 여러 가지 일 경우, 가장 낮은 점수를 더 많이 맞힌 경우를 return 해주세요.
가장 낮은 점수를 맞힌 개수가 같을 경우 계속해서 그다음으로 낮은 점수를 더 많이 맞힌 경우를 return 해주세요.
예를 들어, [2,3,1,0,0,0,0,1,3,0,0]과 [2,1,0,2,0,0,0,2,3,0,0]를 비교하면 [2,1,0,2,0,0,0,2,3,0,0]를 return 해야 합니다.
다른 예로, [0,0,2,3,4,1,0,0,0,0,0]과 [9,0,0,0,0,0,0,0,1,0,0]를 비교하면[9,0,0,0,0,0,0,0,1,0,0]를 return 해야 합니다.
라이언이 우승할 방법이 없는 경우, return 할 정수 배열의 길이는 1입니다.
라이언이 어떻게 화살을 쏘든 라이언의 점수가 어피치의 점수보다 낮거나 같으면 [-1]을 return 해야 합니다.

Code

class Solution {
    private int[] MaxRet;
	private int MaxScore;
    public int[] solution(int n, int[] info) {
        MaxRet = new int[11];
		MaxScore = 0;
		helper(info, n, 0, 0, 0, new int[11]);
		return MaxScore==0?new int[]{-1}:MaxRet;
    }
    public void helper(int[] info, int n, int score, int opponent, int idx, int[] arr) {
		if(idx==10) {
			if(score-opponent>=MaxScore) {
				arr[idx] = n;
				if(MaxScore<(score-opponent)) {
					// set
					setArr(arr);
					MaxScore = score-opponent;
					
				} else if(MaxScore==(score-opponent)) {
					// sort check -> set
					if(checkSort(arr)) setArr(arr);
				}
			}
			return;
		}
		// 이길떄
		if(info[idx]<n) {
			arr[idx] = info[idx]+1;
			helper(info, n-(info[idx]+1), score+(10-idx), opponent, idx+1, arr);
		}
        // 질때
        arr[idx] = 0;
		helper(info, n, score, opponent+(info[idx]>0?(10-idx):0), idx+1, arr);
		return;
	}
	
	public void setArr(int[] arr) {
		for(int i=0 ; i<=10 ; i++) {
			MaxRet[i] = arr[i];
		}
		return;
	}
	
	public boolean checkSort(int[] arr) {
		for(int i=10 ; i>=0 ; i--) {
			if(MaxRet[i]==arr[i]) {
				continue;
			} else if(MaxRet[i]<arr[i]) {
				return true;
			} else {
				break;
			}
		}
		return false;
	}
    
}

0개의 댓글