[Programmers] 실패율★

Apr 17, 2022


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

레벨 1 문제라고 쉽게 봤지만 역시 카카오문제는 호락호락하지 않았다.

정렬부분과
N=5, [2,2,2] 의 경우를 고려하면서 푸는게 어려웠다.
정렬부분에서 1. collections 함수의 정렬과 2. 삽입정렬 직접 구현하여 풀었다.

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    static class rate{
        int stage;
        double percent;
        public rate(int stage,double percent){
            this.stage = stage;//단계
            this.percent = percent;//실패율
        }
    }
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        int userCnt = stages.length;
        int[] noSuc = new int[N+1+1];//해당 스테이지를 못 깬 사람 수
        ArrayList<rate> arr = new ArrayList<>();//단계별 실패율
        for(int i:stages){
            noSuc[i] += 1;
        }
        for(int i=1;i<=N;i++){
            Double db;
            if(noSuc[i]!=0) db = Double.valueOf(noSuc[i])/Double.valueOf(userCnt);
            else db = 0.0;
            arr.add(new rate(i,db));
            userCnt-=noSuc[i];
        }
        
        // 1.fail rate가 높은 순으로 sorting
        //Collections.sort(arr, ((o1, o2) -> Double.compare(o2.percent, o1.percent)));
        
        // 2.삽입정렬
        for(int i=1; i<N; i++){
            for(int j=i; j>=1; j--){
                if(arr.get(j).percent > arr.get(j-1).percent){
                    rate temp = arr.remove(j);
                    arr.add(j-1,new rate(temp.stage,temp.percent));
                }else break;
            }
        }
        
        for(int i=0;i<arr.size();i++){
            answer[i]=arr.get(i).stage;
        }
        return answer;
    }
}