코딩테스트/프로그래머스

[Java] 프로그래머스 - 실패율 (1단계)

배똥회장 2022. 4. 28. 15:43
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

 

 

 

 

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        int[] arrival = new int[N+1];  //스테이지별 도달한 플레이어 수
        int[] noClear = new int[N+1];  //스테이지별 클리어하지 못한 플레이어 수
        
        //도달한 플레이어 수 구하기
        //stages[j](멈춰있는 스테이지)가 i(스테이지 레벨)보다 크거나 같으면 +1
        for (int i = 1; i <= N; i++) { 
            for (int j = 0; j < stages.length; j++) {
                if (stages[j] >= i) arrival[i]++; 
            }
        }
        
        //도달은 했지만 클리어하지 못한 플레이어 수 구하기
        //stages[i]의 해당 스테이지 +1
        for (int i = 0; i < stages.length; i++) {
            if (stages[i] > N) continue;
            noClear[stages[i]]++;
        }
        
        //해시맵에 스테이지와 해당 스테이지의 실패율 저장
        HashMap<Integer, Double> map = new HashMap<>();
        for (int i = 1; i <= N; i++) {
            if (arrival[i] == 0)
                map.put(i, (double) 0);
            else 
                map.put(i, (double) noClear[i] / arrival[i]);
                
        }
        
       	//실패율(내림차순)로 정렬
        //실패율이 동일하면 스테이지 레벨이 작은 것이 앞으로 오게(오름차순) 정렬
        List<Map.Entry<Integer, Double>> arr = new ArrayList<Map.Entry<Integer, Double>>(map.entrySet());
        Collections.sort(arr, new Comparator<Map.Entry<Integer, Double>>(){
            @Override
            public int compare(Map.Entry<Integer, Double> o1, Map.Entry<Integer, Double> o2) {
                double v1 = o1.getValue();
                double v2 = o2.getValue();
                
                if (v1 < v2) {
                    return 1;
                } else if (v1 == v2) {
                    if (o1.getKey() > o2.getKey()) {
                        return 1;
                    }
                }
                
                return -1;
            }
        });
        
        for (int i = 0; i < arr.size(); i++) {
            answer[i] = arr.get(i).getKey();
        }
        
        return answer;
    }
}

 

테스트 1 통과 (0.50ms, 73.7MB)
테스트 2 통과 (0.68ms, 80.5MB)
테스트 3 통과 (23.97ms, 93.4MB)
테스트 4 통과 (84.02ms, 92.1MB)
테스트 5 통과 (323.87ms, 86.4MB)
테스트 6 통과 (4.55ms, 82.7MB)
테스트 7 통과 (9.45ms, 88.4MB)
테스트 8 통과 (102.62ms, 87.6MB)
테스트 9 통과 (295.23ms, 88.3MB)
테스트 10 통과 (47.49ms, 81.1MB)
테스트 11 통과 (98.49ms, 94.1MB)
테스트 12 통과 (47.03ms, 84.7MB)
테스트 13 통과 (86.05ms, 100MB)
테스트 14 통과 (0.49ms, 70.3MB)
테스트 15 통과 (20.82ms, 78.3MB)
테스트 16 통과 (8.20ms, 85.4MB)
테스트 17 통과 (12.28ms, 79.9MB)
테스트 18 통과 (5.29ms, 74.5MB)
테스트 19 통과 (2.36ms, 77.1MB)
테스트 20 통과 (10.64ms, 74.1MB)
테스트 21 통과 (8.66ms, 89.8MB)
테스트 22 통과 (147.99ms, 111MB)
테스트 23 통과 (17.61ms, 92.1MB)
테스트 24 통과 (18.99ms, 92.1MB)
테스트 25 통과 (0.52ms, 78.9MB)
테스트 26 통과 (0.50ms, 77.6MB)
테스트 27 통과 (0.49ms, 79.9MB)

 

 

 

 

 

이게 1단계..?

문제를 풀면서 주의해야할 점은 도달한 플레이어 수가 0인 스테이지는 실패율을 0으로 제대로 처리해야 한다

직접 값을 입력하지 않으면 0으로 나누는 것이 되기 때문에 오류가 뜨기 때문이다.

 

 

 

 

 

 

728x90