プログラマ(Java)-失敗率


質問リンク
https://programmers.co.kr/learn/courses/30/lessons/42889
問題を解く
i段階を過ぎていない人は成功[i-1]で表します.
各フェーズの失敗率はパーセンテージ配列で表されます.
	        int [] success = new int[N+1]; // success[0] 의 값은 1번 스테이지를 못깬사람
	        for(int i =0; i<stages.length; i++){
	            success[stages[i]-1]++;
	        }
i回目の失敗率の成功[i]/stageを得る.length-sum
stagesは全員、sumは第1段階から失敗者数の累計数です.
stages.length-sumはこの段階に挑戦する人数となっている.
ex)
8人のうち1人が失敗した場合、%[0]=1/8
第2段階の失敗者は2名で、李明%[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を持つクラスを作成し、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될때마다 스테이지 번호가 높은 순서대로 정렬된다.
すべての値がキューに入り、ソートされます.
行列の中で一番前の順番で答えの列に入れればいいです.
	        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;
	    }
	}
}