데이터 엔지니어링 정복/Algorithm

[구현/정렬] 프로그래머스 - 실패율 (Java)

eeaarrtthh 2022. 7. 21. 15:17
728x90
반응형

-문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

-자바풀이

import java.util.ArrayList;
import java.util.Collections;

class Result {
    int stage;
    double failure;

    Result( int stage, double failure ) {
        this.stage = stage;
        this.failure = failure;
    }
}

class Solution {
    public int[] solution(int N, int[] stages) {
        
        int[] players = new int[N+2];   //1~최종 단계까지 완료한 사람 담기위해 N+2
        int[] alls = new int[N+1];      //각 Stage에 도달한 전체 유저수
        
        for( int i=0; i<stages.length; i++ ) players[stages[i]]++;
        
        //각 스테이지를 도달한&완료한 유저수 구하기
        //이때 N번째 스테이지는 N번째 도달한 유저 + N+1도달한 유저
        alls[N] = players[N] + players[N+1];
        for( int i=N-1; i>=1; i-- ) {
            alls[i] = players[i] + alls[i+1];
        }
        
        //arraylist에 스테이지와 실패율 저장
        ArrayList<Result> arr = new ArrayList<>();
        for( int i=1; i<=N; i++ ) {
            //스테이지에 도달한 유저 없는 경우 실패율은 0
            if( alls[i]==0 ) {
                arr.add( new Result(i, 0) );
                continue;
            }
            
            double rate = (double)players[i]/alls[i];
            arr.add( new Result(i, rate) );
        }
        
        //실패율 높은 순으로 정렬
        Collections.sort(arr, ( (o1, o2) -> Double.compare(o2.failure, o1.failure) ) );
        
        //정렬된 실패율의 스테이지 번호 저장
        int[] answer = new int[N];
        for( int i=0; i<arr.size(); i++ ) {
            answer[i] = arr.get(i).stage;
        }
        
        
        return answer;
    }
}
728x90
반응형