ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - 실패율 [자바]
    Algorithms/- 프로그래머스 2022. 1. 31. 01:41
     

    코딩테스트 연습 - 실패율

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

    programmers.co.kr

    정답

    import java.util.*;
    
    class Solution {
        public int[] solution(int N, int[] stages) {
    
            /*
            실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
    
            전체 스테이지 수 N
            멈춰 있는 stages
    
            총 플레이어수 stages.length
            모두 클리어한 유저가 있어서 N+1이 됨
            실패율 높은 스테이지부터 내림차순 return
            */
            int length = stages.length; //플레이어 수
    
            //멈춰 있는 스테이지 array
            int[] stageArr = new int[N+1]; //모두 클리어한 유저는 N+1스테이지에 있음
            int[] answer = new int[N];
    
            //모든 플레이어 돌면서 어디 있는지 체크하고 arr에 담는다.
            for(int i=0; i<length; i++){
                int stageNum = stages[i];
                stageArr[stageNum - 1]++;
            }
    
            //실패율은 N 스테이지까지만 계산하면 됨
            Double[] failArr = new Double[N];
            double failRate = 0d;
            Map<Integer, Double> failMap = new HashMap<>();
    
            //실패율 계산
            for(int i=0; i<N ; i++){
                //현재 클리어 못한 수
                //하위는 모두 클리어 한거지
                if(stageArr[i] == 0){
                    failArr[i] = 0d;
                    failMap.put(i+1, 0d);
                    continue;
                }
                failRate = (double) stageArr[i] / (double)length;
                length -= stageArr[i];
                failArr[i] = failRate;
                failMap.put(i+1, failRate);
            }
    
            //역 정렬
            Arrays.sort(failArr, Collections.reverseOrder());
    
            //정렬된 arr와 map에서 index를 찾는다.    
            for(int i=0; i<failArr.length; i++){
                for(int index : failMap.keySet()){
                    Double mapRate = failMap.get(index);
                    if(mapRate.equals(failArr[i])){
                        answer[i] = index;
                        failMap.remove(index);
                        break;
                    }
                }
            }
    
            return answer;
        }
    }

    분석

    • 해당 stage에 도달한 플레이어가 없어서 0이 되면 0을 나누기 때문에 에러가 발생
    • stage가 도달한 플레이어가 0인 경우 실패율 0으로 예외처리

    참고할 만한 정답

    • 클래스로 index와 실패율을 정리한 정답
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    class Solution {
        public int[] solution(int N, int[] lastStages) {
            int nPlayers = lastStages.length;
            int[] nStagePlayers = new int[N + 2];
            for (int stage : lastStages) {
                nStagePlayers[stage] += 1;
            }
    
            int remainingPlayers = nPlayers;
            List<Stage> stages = new ArrayList<>();
            for (int id = 1 ; id <= N; id++) {
                double failure = (double) nStagePlayers[id] / remainingPlayers;
                remainingPlayers -= nStagePlayers[id];
    
                Stage s = new Stage(id, failure);
                stages.add(s);
            }
            Collections.sort(stages, Collections.reverseOrder());
    
            int[] answer = new int[N];
            for (int i = 0; i < N; i++) {
                answer[i] = stages.get(i).id;
            }
            return answer;
        }
    
        class Stage implements Comparable<Stage> {
            public int id;
            public double failure;
    
            public Stage(int id_, double failure_) {
                id = id_;
                failure = failure_;
            }
    
            @Override
            public int compareTo(Stage o) {
                if (failure < o.failure ) {
                    return -1;
                }
                if (failure > o.failure ) {
                    return 1;
                }
                return 0;
            }
        }
    }
    • 자바 기본 기능으로 풀이한 정답
    class Solution {
        public int[] solution(int N, int[] stages) {
            int[] answer = new int[N];
            double[] tempArr = new double[N];
            int arrLength = stages.length;
            int idx = arrLength;
            double tempD = 0;
            int tempI = 0;
            for (int i = 0; i < arrLength; i++) {
                int stage = stages[i];
                if (stage != N + 1)
                    answer[stage - 1] += 1;
            }
            for (int i = 0; i < N; i++) {
                int personNum = answer[i];
                tempArr[i] = (double) personNum / idx;
                idx -= personNum;
                answer[i] = i + 1;
            }
    
            for (int i = 0; i < N; i++) {
                for (int j = 1; j < N - i; j++) {
                    if (tempArr[j - 1] < tempArr[j]) {
                        tempD = tempArr[j - 1];
                        tempArr[j - 1] = tempArr[j];
                        tempArr[j] = tempD;
    
                        tempI = answer[j - 1];
                        answer[j - 1] = answer[j];
                        answer[j] = tempI;
                    }
                }
            }
            return answer;
        }
    }
    • 나와 비슷하게 map으로 풀었지만 방식은 다른 정답
    import java.util.*;
    
    class Solution {
        public int[] solution(int N, int[] stages) {
            Map<Integer,Integer> map = new HashMap<>();
            Map<Integer,Double> ans = new HashMap<>();
    
            for (int stage : stages) {
                int count = map.containsKey(stage) ? map.get(stage) + 1 : 1;
                map.put(stage,count);
            }
    
            int total = stages.length;
            for (int i = 1; i <= N; i++) {
                if (map.containsKey(i)) {
                    int cnt = map.get(i);
                    ans.put(i,  (double) cnt / total);
                    total -= cnt;
                } else {
                    ans.put(i, 0.0);
                }
            }
    
            List<Integer> list = sortByValue(ans);
            int[] answer = new int[list.size()];
            for (int i = 0; i < list.size(); i++) {
                answer[i] = list.get(i);
            }
            return answer;
        }
    
        public static List<Integer> sortByValue(final Map<Integer,Double> map) {
            List<Integer> list = new ArrayList();
            list.addAll(map.keySet());
            Collections.sort(list, (Comparator) (o1, o2) -> {
                Object v1 = map.get(o1);
                Object v2 = map.get(o2);
                return ((Comparable) v2).compareTo(v1);
            });
            return list;
        }
    }
    반응형

    댓글

Designed by Tistory.