본문 바로가기
Problem-solving/프로그래머스

프로그래머스 - (2019 KAKAO BLIND RECRUITMENT) 실패율 (Java)

by taehee.kim.dev 2020. 11. 22.

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

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

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

class Solution {

    private static class FailureInform {

        private final int stageNumber;
        private double failureRate;

        public FailureInform(int stageNumber, int numberOfChallengingUsers,
            int numberOfClearedUsers) {
            this.stageNumber = stageNumber;
            this.setFailureRate(numberOfChallengingUsers, numberOfClearedUsers);
        }

        private void setFailureRate(int numberOfChallengingUsers, int numberOfClearedUsers) {
            if (numberOfChallengingUsers + numberOfClearedUsers == 0){
                failureRate = 0.0;
            }else{
                this.failureRate =
                    (double) numberOfChallengingUsers / (double) (numberOfChallengingUsers + numberOfClearedUsers);
            }
        }
    }

    public int[] solution(int N, int[] stages) {

        int[] answer = new int[N];
        int[] clearedUsersForEachStage = new int[N];
        int[] challengingUsersForEachStage = new int[N];

        for (int challengingStageNumber : stages) {
            for (int clearedStageIndex = 0; clearedStageIndex < challengingStageNumber - 1; clearedStageIndex++) {
                clearedUsersForEachStage[clearedStageIndex] += 1;
            }
            if (challengingStageNumber < N + 1) {
                challengingUsersForEachStage[challengingStageNumber - 1] += 1;
            }
        }

        ArrayList<FailureInform> failureInforms = new ArrayList<>();
        for (int stageIndex = 0; stageIndex < N; stageIndex++) {
            failureInforms.add(new FailureInform(
                stageIndex + 1,
                challengingUsersForEachStage[stageIndex],
                clearedUsersForEachStage[stageIndex]
            ));
        }

        failureInforms.sort((beforeFailureInform, afterFailureInform) -> {
            if (beforeFailureInform.failureRate == afterFailureInform.failureRate) {
                return Integer
                    .compare(beforeFailureInform.stageNumber, afterFailureInform.stageNumber);
            } else {
                return -1 * Double.compare(beforeFailureInform.failureRate,
                    afterFailureInform.failureRate);
            }
        });

        for (int answerIndex = 0; answerIndex < N; answerIndex++){
            answer[answerIndex] = failureInforms.get(answerIndex).stageNumber;
        }

        return answer;
    }
}

댓글