본문 바로가기
정리/알고리즘

프로그래머스 - 실패율

by Hudini30 2022. 4. 11.

해당 문제는 각 스테이지별 머물고 있는 유저의 수를 해시 맵에 넣은 후, 1스테이지부터 N 스테이지까지의 반복문을 돌며 해당 스테이지에 머무르고 있는 유저의 수를 맵에서 꺼내는 방식으로 구현했습니다. N스테이지에 도달한 유저의수는 이전 스테이지에 머문 유저의 수를 뺀 값으로 구하도록 했습니다.

이 후 이 정보를 바탕으로 실패율이 높은 순으로 내림차순, 스테이 번호로 오름 차순 정렬하도록 Comparator를 구현해 정렬 하였습니다

public int[] solution(int N, int[] stages) {
        int passUser = stages.length;
        Map<Integer, Integer> stageMap = new HashMap<>();
        List<StageInfo> stageInfoList = new ArrayList<>();

        for(int stage : stages) {
            stageMap.put(stage, stageMap.getOrDefault(stage, 0) + 1);
        }

        for(int i = 1; i <= N; i++) {
            Integer currentUser = stageMap.getOrDefault(i, 0);
            StageInfo stageInfo = new StageInfo(i, passUser, currentUser);
            passUser -= currentUser;
            stageInfoList.add(stageInfo);
        }

        stageInfoList.sort((o1, o2) -> {
            if(o1.getFailRate() < o2.getFailRate()) {
                return 1;
            } else if(o1.getFailRate() == o2.getFailRate()) {
                return o1.getStage() > o2.getStage() ? 1 : -1;
            } else {
                return -1;
            }
        });

        return stageInfoList.stream().mapToInt(StageInfo::getStage).toArray();
    }

    private class StageInfo {
        private Integer stage;
        private Integer passUser;
        private Integer currentUser;

        public StageInfo(Integer stage, Integer passUser, Integer currentUser) {
            this.stage = stage;
            this.passUser = passUser;
            this.currentUser = currentUser;
        }

        public Integer getStage() {
            return stage;
        }
        public double getFailRate() {
            return passUser > 0 ? (double) currentUser/ passUser : 0;
        }
    }

댓글