Hayden's Archive

[알고리즘] 프로그래머스 : 실패율 본문

Algorithm

[알고리즘] 프로그래머스 : 실패율

_hayden 2021. 2. 17. 11:04

알고리즘 문제 출처 : programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

내가 작성한 코드

실컷 잘 풀어놓고 제출하는데 런타임 에러가 터졌다. 당황해서 다시 코드를 살펴보니 스테이지에 도달한 유저가 없는 경우 실패율(스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수)에서 스테이지에 도달한 플레이어 수가 0이 되고 0이 분모가 되어버리는 것을 발견했다. 따라서 조건문으로 0이 아닌 경우에만 실패율을 구하도록 코드를 수정하니 통과~!

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        double[] countStage = new double[N];
        for(int i=0; i<stages.length; i++) {
            if(stages[i] == (N+1)) continue;
            countStage[stages[i]-1]++;
        }
        int totalPeople = stages.length;
        Map<Double, List<Integer>> map = new HashMap<>();
        for(int i=0; i<countStage.length; i++) {
            double thisStagePeople = countStage[i];
            if(totalPeople != 0) {
                countStage[i] /= totalPeople;
            }
            List<Integer> list = new ArrayList<>();
            if(map.get(countStage[i]) != null) {
                list = map.get(countStage[i]);
            }
            list.add(i+1);
            map.put(countStage[i], list);
            totalPeople -= thisStagePeople;
        }
        Arrays.sort(countStage);
        int index = 0;
        for(int i=countStage.length-1; i>=0; i--) {
            if(i<countStage.length-1 && countStage[i] == countStage[i+1]) {
                continue;
            }else {
                List<Integer> list = map.get(countStage[i]);
                for(int j=0; j<list.size(); j++) {
                    answer[index] = list.get(j);
                    index++;
                }
            }
        }
        return answer;
    }
}