본문 바로가기
알고리즘/코딩 테스트 문제

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

by 진진리 2023. 10. 17.
728x90
  • 제출 코드
import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        double[][] fail = new double[N][2];
        int len = stages.length;
        for(int i=1;i<N+1;i++) fail[i-1][0] = i;
        
        Arrays.sort(stages);
        
        int i=0;
        
        for(int stage=1;stage<=N;stage++){
            double arrive_nc = 0.0;
            double arrive = 0.0;
            for(;i<len;){
                if(stages[i]==stage){
                    arrive_nc += 1.0;
                }
                else if(stages[i]>stage){
                    arrive = len - i + arrive_nc;
                    break;
                }
                i++;
            }
            
            if(arrive_nc != 0 && arrive == 0) arrive = arrive_nc;

            if(arrive!=0) fail[stage-1][1] = arrive_nc / arrive;
            else fail[stage-1][1] = 0;
        }
             
        Arrays.sort(fail, new Comparator<double[]>() {
            @Override
            public int compare(double[] o1, double[] o2){
                return Double.compare(o2[1], o1[1]);
            }
        });
        
        for(i=0;i<N;i++){
            answer[i] = (int)fail[i][0];
        }
        
        return answer;
    }
}

실패율에 따라 배열을 정렬하면서도 기존의 인덱스인 stage를 기억해서 answer에 저장해야한다는 점이 어려웠다.

2차원 double 배열 fail에 stage와 실패율을 저장한 후 저번에 배운 2차원 배열 정렬을 이용해서 해결했다.

 

2차원 배열말고 새로운 클래스를 정의할 수 있다는 걸 다른 사람의 풀이를 보면서 알게 되었다.

그 외의 차이점은 각 stage의 사람의 수를 nStagePlayers[stage]++;과 같이 저장한 뒤 

failure = nStagePlayers[i] / remainingPlayers; remainingPlayers -= nStagePlayers[i]; 와 같이 구했다는 점이었다.