프로그래머스

[프로그래머스] 프로그래머스 Level1 실패율 Java (카카오 코딩테스트)

Doshisha 2022. 5. 6. 18:14

문제

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

풀이

카카오 문제답게 다른 레벨1 문제들에 비해 구현하기 조금 번거로웠다. 문제를 해결하기 위한 알고리즘은 따로 필요 없었고, 순수 구현으로 풀 수 있었다.

fail와 success 배열을 만들어주어 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수를 각각 관리해주었다. 자신이 밟고 있는 현재 스테이지가 stages[i]라면 1 ~ stages[i]까지의 스테이지는 모두 클리어한 것이므로 1 ~ stage[i]의 success를 하나씩 증가시켜주었고, 현재 밟고 있는 스테이지가 stages[i]라면 도달했으나 아직 클리어하지 못한 것이므로 1증가 시켜주어 각각의 요소들을 구할 수 있었다.

이후에는 fail을 success로 나누어주어 스테이지별 실패율을 각각 구해주고 map에 넣어주었다. map을 사용한 이유는 우리가 최종적으로 return해야 하는 것은 실패율이 아닌 각 스테이지의 넘버이기 때문에 map을 통해 스테이지 넘버 : 실패율의 모양으로 관리해주었고 map을 내림차순 정렬시켜 각각의 key값만(스테이지 넘버) answer에 넘겨주면 정답을 도출할 수 있다.

코드

import java.util.*;

class Solution {
    public int[] solution(int N, int[] stages) {

        int[] success = new int[N + 2];
        int[] fail = new int[N + 2];
        HashMap<Integer, Float> map = new HashMap<Integer, Float>();

        for(int i = 0; i < stages.length; i++) {
            for(int j = 1; j <= stages[i]; j++) {
                success[j]++;
            }

            fail[stages[i]]++;
        }

        for(int i = 1; i <= N; i++) {
            float temp = 0;

            if(success[i] == 0) {
                temp = 0;
            } else {
                temp = (float) fail[i] / (float) success[i];
            }

            map.put(i, temp);
        }

        List<Integer> listKeySet = new ArrayList<>(map.keySet());
        Collections.sort(listKeySet, (value1, value2) -> (map.get(value2).compareTo(map.get(value1))));

        int[] answer = new int[map.size()];
        int idx = 0;

        for(Integer key : listKeySet) {
            answer[idx] = key;
            idx++;
        }

        return answer;
    }
}