풀이
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
double[] noClearUser = new double[N];
double[] reachUser = new double[N];
HashMap<Integer, Double> map = new HashMap<>();
for (int i = 0; i < N; i++) {
for (int j = 0; j < stages.length; j++) {
if (stages[j] == i+1) {
noClearUser[i]++;
}
if (stages[j] >= i+1) {
reachUser[i]++;
}
}
if (noClearUser[i] == 0.0 || reachUser[i] == 0.0) {
map.put(i+1, 0.0);
} else {
map.put(i+1, noClearUser[i] / reachUser[i]);
}
}
List<Integer> keySet = new ArrayList<>(map.keySet());
keySet.sort((a, b) -> map.get(b).compareTo(map.get(a)));
for (int i = 0; i < N; i++) {
answer[i] = keySet.get(i);
}
return answer;
}
}
실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
noClearUser 배열에는 각 스테이지에는 도착했지만 (stages[j] == i) 아직 클리어하지 못한 플레이어의 수를 넣는다.
reachUser 배열에는 스테이지에 도달한 플레이어의 수(stages[j] >= i+1) 를 넣는다.
noClearUsers[i]와 reachUser[i]를 나누어 실패율을 구해야 하는데 이 둘이 0.0인지 먼저 체크를 해야한다. (ArtihmeticException 에러)
0.0이면 해당 스테이지 실패율에 0.0을 넣고, 0.0이 아니라면 실패율을 구해서 넣는다.
그 다음 실패율에 따라 내림차순으로 정렬하기 위해 map.keySet을 사용해서 map에 저장한 모든 스테이지를 가져오고 ArrayList에 저장했다. 두 스테이지 번호 a, b를 비교해서 정렬 기준을 설정하고 실패율이 높은 순서로 정렬했다.