🔗양궁대회
import java.util.*;
class Solution {
public int[] solution(int n, int[] info) {
int[] ryan = new int[11];
int[] best = null;
best = dfs(0, n, info, ryan, best);
if (best == null) return new int[]{-1};
return best;
}
private int[] dfs(int idx, int remain, int[] info,
int[] ryan, int[] best) {
// 마지막(0점)
if (idx == 10) {
ryan[10] += remain;
best = updateBest(info, ryan, best);
ryan[10] -= remain;
return best;
}
// 1) 이기는 경우
int need = info[idx] + 1;
if (remain >= need) {
ryan[idx] = need;
best = dfs(idx + 1, remain - need, info, ryan, best);
ryan[idx] = 0;
}
// 2) 포기
best = dfs(idx + 1, remain, info, ryan, best);
return best;
}
// best 갱신 로직
private int[] updateBest(int[] info, int[] ryan, int[] best) {
int diff = calcDiff(info, ryan); // 현재 계산한 값의 점수차
if (diff <= 0) return best; // 어피치 점수가 더 클 때
if (best == null) return Arrays.copyOf(ryan, 11); // 기존 점수가 없을때
int bestDiff = calcDiff(info, best); // 기존 best의 점수차 계산
if (diff > bestDiff) return Arrays.copyOf(ryan, 11); // 현재 점수차가 더 클 때
if (diff == bestDiff && isBetter(ryan, best)) { // 같을 때, 가장 낮은 점수를 더 많이 맞힌 경우 return
return Arrays.copyOf(ryan, 11);
}
return best;
}
// 점수차 계산
private int calcDiff(int[] info, int[] arr) {
int r = 0, a = 0;
for (int i = 0; i < 11; i++) {
int point = 10 - i;
if (info[i] == 0 && arr[i] == 0) continue;
if (arr[i] > info[i]) r += point;
else a += point;
}
return r - a;
}
// 낮은 점수 우선 비교
private boolean isBetter(int[] cand, int[] best) {
for (int i = 10; i >= 0; i--) {
if (cand[i] != best[i]) {
return cand[i] > best[i]; // 낮은 점수가 더 많은지 아닌지
}
}
return false;
}
}'코딩테스트 > 문제풀이' 카테고리의 다른 글
| [ 프로그래머스 ] #140108 : 문자열 나누기 - JAVA (0) | 2025.12.15 |
|---|---|
| [ 프로그래머스 ] #133499 : 옹알이 (2) - JAVA (0) | 2025.12.14 |
| [ 프로그래머스 ] #87377 : 교점에 별 만들기 - JAVA (0) | 2025.12.02 |
| [ 프로그래머스 ] #132265 : 롤케이크 자르기 - JAVA (0) | 2025.12.01 |
| [ 프로그래머스 ] #131705 : 삼총사 - JAVA (0) | 2025.11.30 |