공부 흔적남기기

프로그래머스 실패율 본문

코테/프로그래머스

프로그래머스 실패율

65살까지 코딩 2022. 1. 17. 00:05
728x90
반응형
import java.util.ArrayList;
import java.util.Collections;


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

        //전체 스테이지가 N개
        //현재 멈춰있는 스테이지 번호가 담긴 배열 stages
        //확률이 똑같은 경우 처리와 쓸데없는 곳에서의 실수 때문에 1시간 넘게 걸려서 푼문제이다;; 
        int[] stop_people = new int[N+2];                                 //     1 2 3 4 5 6
        //스테이지를 전부 클리어한 사람이 있을 수 있고 
        //0번째 스테이지는 없기 때문에를 처리해주기 위해 N+2 배열을 만듦
        //각 스테이지 마다 멈춰 있는 사람 수 더해주기
        for(int i =0; i<stages.length; i++){
            for(int j=1; j<stop_people.length; j++){
                if(stages[i] == j){
                    stop_people[j] +=1;
                }
            }
        }
        // 실패 확률을 담을 리스트
        ArrayList<Double> fail = new ArrayList<>();
        // 확률이 중복일 때를 위해 배열 하나를 더 만들어줌
        // 스테이지를 전부 클리어한 사람이 있을 수 있기 때문에 N+1 배열을 만듦
        // 이 조건 놓치기 좋음 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
        double[] doubles = new double[N+1];
        double tmp = 0;
        // 사람들의 수를 all로 넣어둠
        double all = stages.length;
        // 0번째 스테이지(실제로 존재X)가 포함된 배열이기 때문에 stop_people -1로 만듦
        for(int i =1; i<stop_people.length-1; i++){
            //확률 계산하고 
            tmp = stop_people[i] / all;
            //넣어 주기전에 double형이기 때문에 NAN이나 limit이 나올 수 있어
            //멈춘 스테이지에 사람이 없으면 확률은 0
            if(stop_people[i] == 0){
                doubles[i] =0;
            }else {
            //그렇지 않다면 확률은 존재!
                doubles[i] = tmp;
            }
            // 각 스테이지에서 실패한 사람수를 전체에서 빼줌 -> 다음 스테이지 도전자 수를 알 수 있음
            all -= stop_people[i];
            //fail에 확률값 추가
            fail.add(doubles[i]);
        }
        
        int[] answer = new int[N];
        System.out.println(fail);
        //확률을 내림차순으로 정렬
        Collections.sort(fail);
        Collections.reverse(fail);

        //이부분이 은근히 까다로운 느낌이었음
        //카카오LV1 풀면서 느끼는게 문제 자체는 풀만한데 제출 형식에 맞추는게 어려움
        //확률이 같은경우 스테이지가 작은 수가 앞으로 가면됨 
        for(int i=0; i<fail.size(); i++){
            //중복을 처리하기위해 저장해둔 배열사용!
            for(int j=1; j<doubles.length; j++){
                //따라서 1부터 시작  만약 스테이지가 높은 것 부터 원했다면 뒤에서부터 했으면 돌렸어야 됐다.
                if(fail.get(i) == doubles[j]){
                    answer[i] = j;
                    doubles[j] = -1;
                    break;
                }
            }
        }
        for (int i : answer) {
            System.out.println(i);
        }

        return answer;
    }
}

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

728x90
반응형