프로그래머스(Java)-실패율

민지킴·2021년 3월 11일
0

프로그래머스

목록 보기
2/42
post-thumbnail

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42889

문제 풀이

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;
	    }
	}
}
profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글