[ 2019 KAKAO BLIND RECRUITMENT - 실패율 ]
https://programmers.co.kr/learn/courses/30/lessons/42889
- 각 라운드에 몇 명이 지나쳤는지 담을 배열 all을 선언(stages 값은 도전하고 있는 라운드이며 N+1의 값은 이미 도전을 모두 마친 사용자 이므로 N+1 만큼 선언)
- 도전자가 존재하는 challenger 배열 선언(stages 값은 도전하고 있는 라운드이며 N+1의 값은 이미 도전을 모두 마친 사용자 이므로 N+1 만큼 선언)
- 각 라운드 마다의 실패율을 담아줄 rate 배열 선언
- challenger에 스테이지마다 머물고 있는 도전자들의 수를 배열을 확인하며 스테이지 수에 해당하는 칸을 (++)증가 시켜준다.
- 1라운드는 무조건 도전자들이 거치는 단계이므로 all배열 1번째 칸(0)에 8을 넣어주고 그 이후에 2번째 칸(1)부터는 전에 있는 challenger를 빼주면서 칸을 채워준다.
arr[i] = arr[i-1] - challenger[i-1];- for문을 이용해서 [ 해당 스테이지의 도전자 수 / 도전해 본 도전자 수 ]를 하여 실패율을 구해준다. 만약 arr 배열 값이 0 (= 도전해 본 사람이 아무도 없으면)이라면 실패율은 0으로 rate와 실패율 리스트에 같이 넣어준다.
- 실패율 리스트를 내림차 순으로 정렬 후, 리스트의 맨 앞의 값(.get(0))와 배열을 비교하여 몇번째 인덱스에 존재하는지 판별 후 인덱스+1(배열은 0번 부터 시작하므로)의 값을 answer 배열에 담는다. 그 후 해당 인덱스는 동등한 확률값에 걸리지 않기 위해 -1로 값을 변경 후, 사용 한 rate값은 리스트에서 (.remove(0))를 통해 제거 후 break;
- answer값을 리턴.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
class Solution {
public int[] solution(int N, int[] stages) {
int[] all = new int[N + 1];
int[] challenger = new int[N + 1];
double[] rateArr = new double[N];
Arrays.sort(stages);
all[0] = stages.length;
for (int i=0; i<stages.length; i++) {
challenger[stages[i] - 1]++;
}
for (int i=1; i<N; i++) {
all[i] = all[i-1] - challenger[i-1];
}
ArrayList<Double> rate = new ArrayList<Double>();
for (int i=0; i<N; i++) {
if(all[i] == 0) {
rate.add(0.0);
rateArr[i] = 0.0;
}
else {
rate.add((double) challenger[i] / all[i]);
rateArr[i] = rate.get(i);
}
}
Collections.sort(rate, Collections.reverseOrder());
//System.out.println();
int[] answer = new int[N];
for (int i = 0; i < rateArr.length; i++) {
double max = rate.get(0);
for(int j = 0; j<rateArr.length; j++) {
if(max == rateArr[j]) {
answer[i] = j+1;
rateArr[j] = -1;
rate.remove(0);
break;
}
}
}
return answer;
}
}