programmers_양궁대회_java
2023. 5. 29. 12:01ㆍAlgorithm/Programmers
728x90
https://school.programmers.co.kr/learn/courses/30/lessons/92342
class Solution {
private static int[] hit;
private static int diff;
private static boolean end;
public int[] solution(int n, int[] info) {
int[] answer = {};
hit = new int[11];
end = false;
diff = 0;
dfs(n, info, 10, 0, 0, new int[11]);
if (end){
answer = hit;
}else {
answer = new int[]{-1};
}
return answer;
}
// 완전탐색
public void dfs(int n, int[] info, int point, int apeachPoint, int ryanPoint, int[] tt){
if (point == 0){
if (apeachPoint < ryanPoint){
if (n > 0){
tt[10 - point] = n;
}
if (diff < ryanPoint - apeachPoint){ // 점수차가 더 큰 경우
diff = ryanPoint - apeachPoint;
hit = copy(tt);
}else if(diff == ryanPoint - apeachPoint){
if (!comepare(hit, tt)){ // 더 적은 점수를 많이 맞춘 우
hit = copy(tt);
}
}
end = true;
}
tt[10 - point] = 0;
return;
}
// 어피치가 해당 점수를 갖는 경우
if(info[10 - point] > 0){
tt[10 - point] = 0;
dfs(n, info, point - 1, apeachPoint + point, ryanPoint, tt);
}else{ // 둘다 점수를 갖지 않는 경우
tt[10 - point] = 0;
dfs(n, info, point - 1, apeachPoint, ryanPoint, tt);
}
// 라이언이 해당 점수를 갖는 경우
if(n - info[10 - point] -1 >= 0){
tt[10 - point] = info[10 - point] + 1;
dfs(n - info[10 - point] - 1, info, point - 1, apeachPoint, ryanPoint + point, tt);
}
}
// 적은 점수에 많이 맞춘 것 찾기
public boolean comepare(int[] oriArr, int[] newArr){
for (int i = 10; i>=0; i--){
if (oriArr[i] < newArr[i]){
return false;
} else if (oriArr[i] > newArr[i]) {
return true;
}
}
return true;
}
// 배열 복사
public int[] copy(int[] arr){
int[] newArr = new int[arr.length];
for (int i = 0; i<arr.length; i++){
newArr[i] = arr[i];
}
return newArr;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
programmers_교점에 별 만들기_java (0) | 2023.06.01 |
---|---|
programmers_카카오프렌즈 컬러링북_java (0) | 2023.05.31 |
programmers_과제 진행하기_java (1) | 2023.05.26 |
programmers_요격 시스템_java (0) | 2023.05.25 |
programmers_이모티콘 할인행사_java (0) | 2023.05.25 |