코린이의 소소한 공부노트

[프로그래머스/Lv.1] 실패율 본문

코딩테스트 풀이/JAVA

[프로그래머스/Lv.1] 실패율

무지맘 2023. 7. 4. 01:08

1. Input, Output, Example

- 전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 반환

- 실패율 계산: 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

 

2. Constraint

1) 스테이지의 개수 N1 이상 500 이하의 자연수

2) stages의 길이는 1 이상 200,000 이하

3) stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.

4) 각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다. , N + 1 은 마지막 스테이지(N 번째 스테이지)까지 클리어 한 사용자를 나타낸다.

5) 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.

6) 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.

 

3. Code

import java.util.*;
class Solution { // 1
    public int[] solution(int N, int[] stages) {
        int[] reach = new int[N+1];
        int[] success = new int[N+1];
        for(int i : stages){
            for(int j=1 ; j<i ; j++){
                reach[j]++; success[j]++;
            }
            if(i<=N) reach[i]++;
        }
        List<Double> sorted = new ArrayList<>();
        List<Double> origin = new ArrayList<>();
        for(int i=1 ; i<=N ; i++){
            double d = reach[i]==0? 0 : 1 - (double)success[i]/reach[i];
            sorted.add(d); origin.add(d);
        }
        sorted.sort(Comparator.reverseOrder());
        int[] result = new int[N];
        for(int i=0 ; i<N ; i++){
            result[i] = origin.indexOf(sorted.get(i))+1;
            origin.set(origin.indexOf(sorted.get(i)),-1.0); // 중복 선택 방지
        }
        return result;
    }
}

- +1

- 마음에 들진 않지만 별 수 있나..