Learn & Run

[Programmers] 실패율 (Java, Kotlin) 본문

Algorithm/Programmers

[Programmers] 실패율 (Java, Kotlin)

iron9462 2021. 8. 30. 00:21

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

문제

위의 링크를 통해 문제를 확인해 보면, 실패율은 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수로 정의한다. 입력값으로 전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 반환하면 됩니다.

 

접근 아이디어

1. N개의 스테이지 중에서 각 플레이어들이 몇단계까지 도전하였는지 확인합니다.

2. 문제에 제시된 실패율의 정의에 맞게 각 단계별 실패율을 모두 구합니다.

3. 실패율이 높은 순으로 스테이지 번호를 정렬한다음에 결과값을 반환합니다.

 

조심해야할 점

아래 로직을 살펴보면 스테이지에 도달한 플레이어 수를 나누어 실패율을 구하게 되는데, 이 때 플레이어 수가 0이 될 때를 잘 체크 해주어야 합니다. 분모가 0이면 값이 Nan으로 나와서 틀린 결과값을 반환하게 됩니다.

 

 

- Java

import java.util.*;

class Solution {
     public int[] solution(int N, int[] stages) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int stage : stages) { //스테이지별로 도전한 사용자의 수 구하기
            map.put(stage, map.getOrDefault(stage, 0) + 1);
        }

        int size = stages.length;
        List<Pair> list = new ArrayList<>();
        for (int i = 1; i <= N; i++) {
            int each = map.get(i) != null ? map.get(i) : 0;
            double fail = (size == 0 ? 0 : (double) each / size);
            list.add(new Pair(i, fail));
            size -= each;
        }

        list.sort((o1, o2) -> {
            double compare = o1.fail - o2.fail;
            if (compare < 0) return 1;
            else if (compare == 0) return 0;
            else return -1;
        });
        
        return list.stream().mapToInt(it -> it.index).toArray();
    }

    class Pair {
        int index;
        double fail;

        Pair(int first, double second) {
            this.index = first;
            this.fail = second;
        }

        @Override
        public String toString() {
            return "Pair{" +
                    "first=" + index +
                    ", second=" + fail +
                    '}';
        }
    }
}

 

 

- Kotlin

import java.util.*;

class Solution {
    fun solution(N: Int, stages: IntArray): IntArray {
        val map: MutableMap<Int, Int?> = HashMap()
        for (stage in stages) { //스테이지별로 도전한 사용자의 수 구하기
            map[stage] = map.getOrDefault(stage, 0)!! + 1
        }

        var size: Int = stages.size
        val list: MutableList<Pair<Int, Double>> = ArrayList()
        for (i in 1..N) {
            val each = if (map[i] != null) map[i]!! else 0
            val fail: Double = if (size == 0) 0.0 else each.toDouble() / size
            list.add(Pair(i, fail))
            size -= each
        }

        list.sortByDescending { it.second }

        return list.stream().mapToInt { it: Pair<Int, Double> -> it.first }.toArray()
    }
}

 

 

좌(Java 채점 결과), 우(Kotlin 채점 결과)