Published:
Updated:


Solution

package programmers.sully.week3;

import java.util.*;

class 실패율 {
    // (스테이지 도달했으나, 클리어 x) / (스테이지 도달한 플레이어 수)
    // N: 전체 스테이지 개수
    // stage: 사용자가 "멈춰있는" 스테이지 번호 배열 -> 각 배열은 사용자가 현재 도전 중인 스테이지 번호

    // 만약, 실패율 같은 스테이지 존재 -> 작은 번호의 스테이지가 먼저 오도록 (정렬할 때 예외처리 해줄 것.)
    // 스테이지에 도달한 유저가 없는 경우 -> 실패율 0으로 예외처리

    // 실패율이 높은 것부터 내림차순으로 스테이지 번호 담긴 배열 return
    public static int[] solution(int N, int[] stages) {
        Map<Integer, Double> map = new HashMap<>(N);

        // 분모는 stages의 길이로 초기화
        int denominator = stages.length;

        for (int i = 1; i <= N; i++) {
            int tmp = i;
            int numerator = (int) Arrays.stream(stages).filter(num -> num == tmp).count();

//            System.out.println(numerator + "/" + denominator);

            if (denominator == 0) {
                map.put(i, 0d);
            } else {
                map.put(i, (double) numerator / denominator);
            }

            // N이 증가할 때마다 분모는 분자값을 빼준 값이 됨
            denominator -= numerator;
        }



        List<Integer> list = new ArrayList<>(map.keySet());
        list.sort(((o1, o2) -> Double.compare(map.get(o2), map.get(o1))));

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

    public static void main(String[] args) {
        System.out.println(Arrays.toString(solution(5, new int[]{2, 1, 2, 6, 2, 4, 3, 3})));
    }
}

Leave a comment