티스토리 뷰

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 설명

각 스테이지 별로 도전한 사람과 클리어한 사람의 수를 먼저 구하고,

공식에 넣어 실패율을 구한다.

0으로 나눠질 때 예외처리를 꼭 해줘야 된다. 안하면 틀림

정렬같은 경우, o1과 o2를 비교해서 내림차순 정렬하는 건데,

서로 떨어져 있는 요소를 교환하는게 아니라 요소들이 서로 뒤바뀌지 않는다.

따라서 안정된 정렬이므로 굳이 같은 실패율을 가진 스테이지를 다시 오름차순 정렬할 필요가 없다.

(**안정된 정렬 : 같은 값의 키를 가진 요소의 순서가 정렬전후에도 유지되는 것)

 

근데 왜이렇게 시간이 오래걸리는 걸까. 하나하나 다 비교해서 그런가

 

3. 코드

import java.util.Arrays;

class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        fail[] fails = new fail[N]; // 실패율
        
        double players; // 도전
        double inStage; // 클리어x
        for(int i=1; i<=N; i++) {
            players = 0;
            inStage = 0;
            for(int j=0; j<stages.length; j++) {
                if(i<=stages[j]) {
                    players++;
                    if(i==stages[j]) inStage++;
                }
            }
            if(players==0) // 0 나누기 예외처리
                fails[i-1] = new fail(i,0);
            else
                fails[i-1] = new fail(i,inStage/players);
        }
        
        // 내림차순 정렬
        Arrays.sort(fails, (o1, o2) -> {
            return Double.compare(o2.rate, o1.rate);
        });
        
        for(int i=0; i<N; i++) {
            answer[i] = fails[i].num;
        }
        
        return answer;
    }
    static class fail {
        int num;
        double rate;
        fail(int num, double rate) {
            this.num = num;
            this.rate = rate;
        }
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday