0. 사용 함수
- Collections.sort
1. 문제 내용
- 설명
스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수 = 실패율
실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return.
- 제한 사항
스테이지의 개수 N은 1 이상 500 이하의 자연수이다.
stages의 길이는 1 이상 200,000 이하이다.
stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.
단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.
만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
2. 문제 풀이
import java.util.Map;
import java.util.LinkedHashMap;
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
int totalNum = stages.length;
Map<Integer, Double> fRateMap = new LinkedHashMap<>();
for(int i = 1; i <= N; i++){
//스테이지에 도달한 플레이어 수
int tmpCount = 0;
//스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수
int pStagePlayer = findNumCount(stages, i);
//실패율
double fRate = (double)findNumCount(stages, i)>0?(double)findNumCount(stages, i)/totalNum:0;
fRateMap.put(i, fRate);
totalNum -= pStagePlayer;
}
int[] answer = sortByValue(fRateMap);
return answer;
}
public int findNumCount(int[] list, int findNum){
int count = 0;
for(int i : list){
if(i == findNum){
count++;
}
}
return count;
}
public int[] sortByValue(Map<Integer, Double> map){
List<Map.Entry<Integer, Double>> entries = new LinkedList<>(map.entrySet());
int[] result = new int[entries.size()];
for (Map.Entry<Integer, Double> entry : entries) {
Collections.sort(entries, new Comparator<Map.Entry<Integer,Double> > () {
public int compare(Map.Entry<Integer,Double> a, Map.Entry<Integer,Double> b){
return -a.getValue().compareTo(b.getValue());
}
});
}
for (int i=entries.size()-1; i >=0; i--) {
result[i] = entries.get(i).getKey();
}
return result;
}
}
3. 채점 결과
- 정확성 테스트
테스트 1 〉 | 통과 (1.07ms, 75.7MB) |
테스트 2 〉 | 통과 (1.98ms, 69.6MB) |
테스트 3 〉 | 통과 (27.14ms, 81.9MB) |
테스트 4 〉 | 통과 (46.18ms, 86.8MB) |
테스트 5 〉 | 통과 (133.64ms, 94.1MB) |
테스트 6 〉 | 통과 (5.25ms, 76.7MB) |
테스트 7 〉 | 통과 (11.31ms, 87.8MB) |
테스트 8 〉 | 통과 (40.57ms, 81.8MB) |
테스트 9 〉 | 통과 (161.69ms, 89.1MB) |
테스트 10 〉 | 통과 (20.46ms, 88.5MB) |
테스트 11 〉 | 통과 (39.41ms, 83.9MB) |
테스트 12 〉 | 통과 (44.66ms, 96MB) |
테스트 13 〉 | 통과 (53.98ms, 101MB) |
테스트 14 〉 | 통과 (1.27ms, 81.8MB) |
테스트 15 〉 | 통과 (7.37ms, 72.4MB) |
테스트 16 〉 | 통과 (7.49ms, 81.3MB) |
테스트 17 〉 | 통과 (11.19ms, 87.4MB) |
테스트 18 〉 | 통과 (7.67ms, 90.6MB) |
테스트 19 〉 | 통과 (3.62ms, 78.4MB) |
테스트 20 〉 | 통과 (8.89ms, 76.4MB) |
테스트 21 〉 | 통과 (11.23ms, 79MB) |
테스트 22 〉 | 통과 (82.74ms, 86.7MB) |
테스트 23 〉 | 통과 (10.56ms, 92.5MB) |
테스트 24 〉 | 통과 (16.85ms, 90.5MB) |
테스트 25 〉 | 통과 (0.77ms, 75.6MB) |
테스트 26 〉 | 통과 (0.65ms, 71.8MB) |
테스트 27 〉 | 통과 (0.68ms, 77.8MB) |
참고로 질문방에 "juu"라는 분께서 1, 6, 7, 9, 13, 23, 24, 25번 오류나는 사람들을 위해 글을 올려놨다.
나도 1, 6, 7, 9, 13, 23, 24, 25번에서 오류가 났기 때문에 참고했다.
1, 6, 7, 9, 13, 23, 24, 25번 런타임에러 뜨는 분들을 위해
스테이지에 도달한 플레이어 수가 0보다 큰 경우와 0인 경우로 나눠서 생각해야 합니다.문제에서 스테이지에 도달한 플레이어가 없으면 실패율이 0이라고 했으므로스테이지에 도달한 플레이어 수가 0보다 크면 (스테이지를 클리어하지 못한 플레이어 수) / (스테이지에 도달한 플레이어 수)스테이지에 도달한 플레이어 수가 0이면 0으로 정의하시면 됩니다.(예시: N=3, stages=[1, 1, 1])