각 스테이지당 실패율을 계산한 후, 스테이지와 실패율을 담은 Class를 정의하여 우선순위 큐에 담는다. 그 후, Comparator를 이용하여 실패율을 기준으로 내림차순 정리하면 된다. 그다지 어렵진 않지만,
이런 제한 사항이 붙어있기 때문에 약간의 핸들링이 필요하다. 나는 스테이지와 실패율을 담은 클래스에 compareTo 메소드를 오버라이드했다.
import java.util.*;
class Solution {
public int[] solution(int N, int[] stages) {
PriorityQueue<Node> pq = new PriorityQueue();
int[] progress = new int[N + 2]; // stages 는 1이상 N+1이하
int trys = stages.length;
for (int i = 0; i < stages.length; i++) {
progress[stages[i]]++;
}
for (int i = 1; i <= N; i++) {
double fail=0;
if (trys == 0) {
fail = 0;
} else {
fail = (double) progress[i] / (double) trys;
}
trys -= progress[i];
Node n = new Node(i, fail);
pq.offer(n);
}
int[] answer = new int[pq.size()];
int size = pq.size();
for (int i = 0; i < size; i++) {
answer[i] = pq.poll().stage;
}
return answer;
}
static class Node implements Comparable<Node> {
int stage;
double fail;
Node(int stage, double fail) {
this.stage = stage;
this.fail = fail;
}
@Override
public int compareTo(Node n) {
if (this.fail == n.fail) { // 실패율이 같다면 stage 낮은게 먼저
if (this.stage < n.stage) {
return -1;
} else {
return 1;
}
} else
return this.fail < n.fail ? 1 : -1;
}
}
}