i번째 단계를 못 넘은 사람은 success[i-1]로 표현을 했고,
각 단계별 실패율을 percent 배열을 통해서 나타냈다.
int [] success = new int[N+1]; // success[0] 의 값은 1번 스테이지를 못깬사람
for(int i =0; i<stages.length; i++){
success[stages[i]-1]++;
}
i번째의 실패율을은 success[i]/stage.length-sum 인데
stages는 전체 인원이고, sum은 1단계부터 실패한 사람수의 누적 카운트이다.
stages.length-sum은 그 단계에 도전한 사람의 수가 된다.
ex)
8명중 1단계 실패 인원이 1명이면 percent[0] = 1/8
2단계 실패 인원이2명이명 percent[1]=2/(8-1)이 되어 2/7이 된다.
int sum=0;
for(int i=0; i<percent.length;i++){
percent[i]=(float)success[i]/(stages.length-sum);
sum+=success[i];
pq.add(new Score(i+1,percent[i]));
}
실패율을 높은 순서대로, 그값의 idx를 반환해야 해서
실패율과, idx를 가진 class를 하나 만들고 compareTo를 통해서
실패율이 높은순, 실패율이 같다면 번호가 낮은순으로
PriorityQueue에 저장하고자 하였다.
class Score implements Comparable<Score>{
int idx;
float percent;
public Score(int idx, float percent){
this.idx = idx;
this.percent = percent;
}
public int compareTo(Score o){
if(this.percent>o.percent){
return -1;
}else if(this.percent<o.percent){
return 1;
}else{
if(this.idx>o.idx){
return 1;
}else{
return -1;
}
}
}
public String toString(){
return idx+"";
}
}
PriorityQueue<Score>pq = new PriorityQueue<>(); //스테이지번호, 실패율을 담을 큐
pq.add(new Score(i+1,percent[i])); //pq에 add될때마다 스테이지 번호가 높은 순서대로 정렬된다.
모든 값들이 queue에 들어가며 정렬이 되었기 때문에
큐에 맨 앞들 순서대로 answer 배열에 넣어주면 된다.
for(int i=0; i<answer.length;i++){
answer[i] = pq.peek().idx;
pq.remove();
}
import java.util.*;
public class FailureRate {
class Score implements Comparable<Score>{
int idx;
float percent;
public Score(int idx, float percent){
this.idx = idx;
this.percent = percent;
}
public int compareTo(Score o){
if(this.percent>o.percent){
return -1;
}else if(this.percent<o.percent){
return 1;
}else{
if(this.idx>o.idx){
return 1;
}else{
return -1;
}
}
}
public String toString(){
return idx+"";
}
}
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N]; //결과
PriorityQueue<Score>pq = new PriorityQueue<>(); //스테이지번호, 실패율을 담을 큐
int [] success = new int[N+1]; // success[0] 의 값은 1번 스테이지를 못깬사람
for(int i =0; i<stages.length; i++){
success[stages[i]-1]++;
}
float [] percent = new float[N];
int sum=0;
for(int i=0; i<percent.length;i++){
percent[i]=(float)success[i]/(stages.length-sum);
sum+=success[i];
pq.add(new Score(i+1,percent[i]));
}
for(int i=0; i<answer.length;i++){
answer[i] = pq.peek().idx;
pq.remove();
}
return answer;
}
}
}