본문 바로가기
Beakjoon&프로그래머스/Java

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

by 현장 2025. 2. 27.

-Code

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        Map<Integer, Double> stageFailRate = new HashMap<>();
        double total = stages.length;
        for(int i = 1; i <= N; i++) stageFailRate.put(i, 0d);

        for(int stage : stages) {
            if (stageFailRate.containsKey(stage)) {
                double val = stageFailRate.get(stage) + 1;
                stageFailRate.put(stage, val);
            }
        }
        
        for (int key : stageFailRate.keySet()) {
            double val = stageFailRate.get(key) ;
            stageFailRate.put(key, val == 0 ? 0 : val / total);
            total -= val;
        }

        List<Integer> keySet = new ArrayList<>(stageFailRate.keySet());
        keySet.sort((o1, o2) -> stageFailRate.get(o2)
                .compareTo(stageFailRate.get(o1)));

        return keySet.stream().mapToInt(Integer::intValue).toArray();
    }
}

Map으로 받아서 value 값으로 정렬하는 법을 찾아보느라 좀 오래 걸렸습니다.

 

key값만 사용하기에 keySet으로 따로 리스트를 빼고 sort를 통해서 value의 값을 역순으로 정렬하는데 처음에는 익숙하지 않아서 찾아본 내용을 참고해서 아래와 같이 사용했습니다.

keySet.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return stageFailRate.get(o1)
                        .compareTo(stageFailRate.get(o2));
            }
        });

그러나 ide에서 람다로 사용하는 방법을 알려줘서

keySet.sort((o1, o2) -> stageFailRate.get(o1)
        .compareTo(stageFailRate.get(o2)));

위와 같이 변경했지만 오름 차순으로 나와서 역순으로 하는 방법을 찾아서 위의 코드 처럼 해결하게 되었습니다.