반응형
[문제링크]
https://programmers.co.kr/learn/courses/30/lessons/92342
[설명]
이 문제는 실제 시험에서 풀지 못하였습니다. 다른 사람들의 풀이를 보니 DFS로 풀었습니다.
1) answer를 정렬하여 가장 작은 점수가 많은 경우를 결과값으로 주어지므로 ArrayList로 선언한다.
2) dfs를 돌며 cnt가 N일 경우 apeach와 ryan의 점수를 계산한다.
3) 만약 ryan의 점수가 apeach의 점수보다 클 경우 r-a가 max보다 큰지 확인한다.
4-1) r-a가 max보다 클때 answer를 초기화 하고 ryan의 배열을 넣어준다.
5) 전부 다 돌고 answer를 정렬하여 index:0 인 경우를 출력한다.
프로그래머스 2022 KAKAO BLIND RECRUITMENT - 양궁대회 JAVA풀이
import java.util.*;
class Solution {
static ArrayList<int[]> answer = new ArrayList<>();
static int[] ryan;
static int[] apeach;
static int N;
static int max = Integer.MIN_VALUE;
public int[] solution(int n, int[] info) {
ryan = new int[11];
N=n;
apeach = info.clone();
DFS(0,0);
if(answer.isEmpty())return new int[]{-1};
Collections.sort(answer, (o1, o2) -> {
for(int i=10;i>=0;i--){
if(o1[i] != o2[i]) return o2[i] - o1[i];
}
return 0;
});
return answer.get(0);
}
public static void DFS(int cnt, int s){
if(cnt==N){
int a=0, r=0; //apeach, ryan 점수
for(int i=0;i<=10;i++){
if(apeach[i]==0 && ryan[i]==0)continue;
if(apeach[i]<ryan[i]) r += 10-i;
else a+=10-i;
}
if(r>a) {
int diff = r-a;
if(diff>max){
max=diff;
answer.clear();
answer.add(ryan.clone());
}
else if(diff==max) answer.add(ryan.clone());
}
}
else{
for(int i=s;i<11;i++){
ryan[i]++;
DFS(cnt+1, i);
ryan[i]--;
}
}
}
}
궁금하신 부분이나 부족한 점은 댓글로 알려주시면 감사하겠습니다.
반응형
'알고리즘 > DFS_BFS' 카테고리의 다른 글
BJ_G4_14502_연구소 - Java (0) | 2022.10.07 |
---|---|
BJ_S2_10819_차이를최대로 - Java (0) | 2022.06.08 |
BJ_S1_1389_케빈베이컨의6단계법칙 - Java (0) | 2022.06.07 |
2022 KAKAO BLIND RECRUITMENT - 양과 늑대 (0) | 2022.06.05 |
댓글