코테 공부
양궁대회(프로그래머스, 자바)
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;
}
}
}