정답
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
/*
실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
전체 스테이지 수 N
멈춰 있는 stages
총 플레이어수 stages.length
모두 클리어한 유저가 있어서 N+1이 됨
실패율 높은 스테이지부터 내림차순 return
*/
int length = stages.length; //플레이어 수
//멈춰 있는 스테이지 array
int[] stageArr = new int[N+1]; //모두 클리어한 유저는 N+1스테이지에 있음
int[] answer = new int[N];
//모든 플레이어 돌면서 어디 있는지 체크하고 arr에 담는다.
for(int i=0; i<length; i++){
int stageNum = stages[i];
stageArr[stageNum - 1]++;
}
//실패율은 N 스테이지까지만 계산하면 됨
Double[] failArr = new Double[N];
double failRate = 0d;
Map<Integer, Double> failMap = new HashMap<>();
//실패율 계산
for(int i=0; i<N ; i++){
//현재 클리어 못한 수
//하위는 모두 클리어 한거지
if(stageArr[i] == 0){
failArr[i] = 0d;
failMap.put(i+1, 0d);
continue;
}
failRate = (double) stageArr[i] / (double)length;
length -= stageArr[i];
failArr[i] = failRate;
failMap.put(i+1, failRate);
}
//역 정렬
Arrays.sort(failArr, Collections.reverseOrder());
//정렬된 arr와 map에서 index를 찾는다.
for(int i=0; i<failArr.length; i++){
for(int index : failMap.keySet()){
Double mapRate = failMap.get(index);
if(mapRate.equals(failArr[i])){
answer[i] = index;
failMap.remove(index);
break;
}
}
}
return answer;
}
}
분석
- 해당 stage에 도달한 플레이어가 없어서 0이 되면 0을 나누기 때문에 에러가 발생
- stage가 도달한 플레이어가 0인 경우 실패율 0으로 예외처리
참고할 만한 정답
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Solution {
public int[] solution(int N, int[] lastStages) {
int nPlayers = lastStages.length;
int[] nStagePlayers = new int[N + 2];
for (int stage : lastStages) {
nStagePlayers[stage] += 1;
}
int remainingPlayers = nPlayers;
List<Stage> stages = new ArrayList<>();
for (int id = 1 ; id <= N; id++) {
double failure = (double) nStagePlayers[id] / remainingPlayers;
remainingPlayers -= nStagePlayers[id];
Stage s = new Stage(id, failure);
stages.add(s);
}
Collections.sort(stages, Collections.reverseOrder());
int[] answer = new int[N];
for (int i = 0; i < N; i++) {
answer[i] = stages.get(i).id;
}
return answer;
}
class Stage implements Comparable<Stage> {
public int id;
public double failure;
public Stage(int id_, double failure_) {
id = id_;
failure = failure_;
}
@Override
public int compareTo(Stage o) {
if (failure < o.failure ) {
return -1;
}
if (failure > o.failure ) {
return 1;
}
return 0;
}
}
}
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
double[] tempArr = new double[N];
int arrLength = stages.length;
int idx = arrLength;
double tempD = 0;
int tempI = 0;
for (int i = 0; i < arrLength; i++) {
int stage = stages[i];
if (stage != N + 1)
answer[stage - 1] += 1;
}
for (int i = 0; i < N; i++) {
int personNum = answer[i];
tempArr[i] = (double) personNum / idx;
idx -= personNum;
answer[i] = i + 1;
}
for (int i = 0; i < N; i++) {
for (int j = 1; j < N - i; j++) {
if (tempArr[j - 1] < tempArr[j]) {
tempD = tempArr[j - 1];
tempArr[j - 1] = tempArr[j];
tempArr[j] = tempD;
tempI = answer[j - 1];
answer[j - 1] = answer[j];
answer[j] = tempI;
}
}
}
return answer;
}
}
- 나와 비슷하게 map으로 풀었지만 방식은 다른 정답
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
Map<Integer,Integer> map = new HashMap<>();
Map<Integer,Double> ans = new HashMap<>();
for (int stage : stages) {
int count = map.containsKey(stage) ? map.get(stage) + 1 : 1;
map.put(stage,count);
}
int total = stages.length;
for (int i = 1; i <= N; i++) {
if (map.containsKey(i)) {
int cnt = map.get(i);
ans.put(i, (double) cnt / total);
total -= cnt;
} else {
ans.put(i, 0.0);
}
}
List<Integer> list = sortByValue(ans);
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
public static List<Integer> sortByValue(final Map<Integer,Double> map) {
List<Integer> list = new ArrayList();
list.addAll(map.keySet());
Collections.sort(list, (Comparator) (o1, o2) -> {
Object v1 = map.get(o1);
Object v2 = map.get(o2);
return ((Comparable) v2).compareTo(v1);
});
return list;
}
}