[코테/JAVA] 2019 KAKAO BLIND RECRUITMENT : 실패율

    728x90
    반응형

    2021.10.31

    65번째 포스팅

     

    입사 237일차.

    코테 문제풀이 4주차 1번 문제

     

     

    0. 문제

      ① 2019 KAKAO BLIND RECRUITMENT : 실패율

      ② 설명

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

    이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.
    • 실패율은 다음과 같이 정의한다.
      • 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
    전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.
    제한사항
    • 스테이지의 개수 N은 1 이상 500 이하의 자연수이다.
    • stages의 길이는 1 이상 200,000 이하이다.
    • stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
      • 각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.
      • 단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.
    • 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
    • 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.

      ③ 링크

     

    코딩테스트 연습 - 실패율

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

    programmers.co.kr

     

     

    1. 접근방법

      생각해낸 방법은 2가지

      ① 클래스(구조체)를 사용해서 index와 value를 같이 저장

      ② HashMap 사용해서 index와 value를 같이 저장

     

     

    2. 풀이

      ① 접근방법 :

      ② 풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    import java.util.*;
     
    class Solution {
        /**
        * 시작시간 : 10:05
        * 종료시간 : 11:45
        */
        
        static class failRate {
            int idx;
            double rate;
            
            public failRate(int idx, double rate) {
                this.idx = idx;
                this.rate = rate;
            }
        }
        
        public int[] solution(int N, int[] stages) {
            int[] answer = solveCT(N, stages);
            return answer;
        }
        
        public int[] solveCT(int N, int[] stages) {
            int[] failCnt = new int[N];
            int[] tryCnt = new int[N];
            double[] failPercent = new double[N];
            int[] answer = new int[N];
            
            for (int i = 0; i < N; i++) {
                answer[i] = i + 1;
            }
            
            // 실패한 사람의 수
            for (int i = 0; i < stages.length; i++) {
                if (stages[i] <= N) {
                    failCnt[stages[i] - 1]++;
                } 
            }
            
            // 시도한 사람의 수
            for (int i = 0; i < failCnt.length; i++) {
                if (i == 0) tryCnt[i] = stages.length;
                else {
                    tryCnt[i] = tryCnt[i - 1- failCnt[i - 1];
                }
                // 실패율
                if (failCnt[i] == 0) failPercent[i] = 0.0;
                else failPercent[i] = (double)failCnt[i] / tryCnt[i];
                
            }
            
            List<failRate> list = new ArrayList<>();
            for (int i = 0; i < N; i++) {
                list.add(new failRate(i + 1, failPercent[i]));
            }
            Collections.sort(list, ((o1, o2) -> Double.compare(o2.rate, o1.rate)));
            
            for (int i = 0; i < list.size(); i++) {
                answer[i] = list.get(i).idx;
            }
            
            return answer;
        }
    }
    cs

     

     

    3. 결과

     

     

    4. 주의사항

      ① 시도한 사람의 수 = 전체 플레이어 N명 - 이전 스테이지까지 실패한 플레이어들의 수

      ② Collections.sort() -> Double.compare(); 메소드의 사용방법에 대한 숙지가 필요

    728x90
    반응형

    댓글