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;
    }
}
반응형