알고리즘/프로그래머스 Level1

[프로그래머스,자바] Level1 : 실패율

류창 2021. 8. 12. 23:14

문제분석

stages에 담겨져있는 숫자들은 각각의 유저가 클리어하지 못한 스테이지의 번호를 나타낸 배열이다.

 

여기서 실패율을 구하는데 실패율은 (클리어하지못한 스테이지 번호의 수/스테이지에 도달한 유저)이다. 

 

각 스테이지마다 실패율을 구했다면,  실패율을 제한사항 규칙에 따라 정렬한다.

 

재정렬을 했다면, 실패율이 높은스테이지부터 내림차순으로 반환한다.

 

언뜻보면 정말 간단해보이지만, 코딩을 시작하는순간 막히는지점이 꽤있다. 그것 역시 다뤄보겠다.

 

우선 실패율을 구하는것까진 큰 어려움이없다. 

 

그런데 모든 스테이지의 실패율을 구해놨고 재정렬하려다가, 문득 이 실패율이 어느 스테이지의 실패율인지 모르게된다.

 

이걸 해결하기위해서, [ 스테이지의 번호, 실패율] 을 저장하는 배열을 준비한다.

 

배열을 정렬하려고하는데, 실패율에 따라 정렬하려고한다.

하지만 일반 정렬을 하면 제한사항 규칙에 맞지않는다. 사용자가 직접 정렬규칙을 설정해야한다.

 

람다식을 사용해, 정말 간단하게 정렬 구현이 가능하다!

람다식을 사용한것과 람다식을 안쓰고 정석대로 한것 2개를 소개하겠습니다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 // 내가 직접 정렬조건을 만들어쓴다!
    Comparator<double[]> comparator = new Comparator<double[]>() {
    @Override
    public int compare(double[] a, double[] b) {
        if(a[1]>b[1]){
            return -1;
        }
        else if(a[1]==b[1]){
            return Double.valueOf(a[0]).compareTo(Double.valueOf(b[0]));
        }
        else {
            return 1;
        }
    }
};
        
        //내가새로 재정의한 정렬기준을 적용한다.
        Collections.sort(fail_rate,comparator);
cs

우선 람다식을 안쓰고 구현을 하려면 Comparator 클래스를 새로만들어 Override(재정의) 해서 써야한다.

 

조건이 내림차순이니 맞게 구현을해준다.

 

이 긴코드를 한줄로 줄일수있다!

1
2
3
 //한 줄로도 쓸수가있다!
        fail_rate.sort((a,b)->Double.compare(b[1],a[1]));
        
cs

처음엔 fail_rate.sort(a,b)->b[1]-a[1]) 로 구현을 했었는데, 실패율이 double타입이라 불가능하다.

Double클래스에있는 compare메소드를 활용해서 구현하자.

 

 

문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;
class Solution {
    public int[] solution(int N, int[] stages) {
        int[] answer = new int[N];
        double users =stages.length;
        List<double[]> fail_rate = new ArrayList<>();
        
        int cnt=0;
        
        for(int i=1;i<=N;i++){
            for(int j=0;j<stages.length;j++){
                if(i==stages[j]){
                    cnt++;
                }
            }
           if(cnt==0){
              fail_rate.add(new double[]{i,0});
              continue;
          }
          fail_rate.add(new double[]{i,cnt/users});
          users-=cnt;
          cnt=0;
        }
        
        //한 줄로도 쓸수가있다!
        fail_rate.sort((a,b)->Double.compare(b[1],a[1]));
        
        for(int i=0;i<fail_rate.size();i++){
            answer[i]=(int)fail_rate.get(i)[0];
        }
        
        return answer;
    }
}
cs