이 문제의 핵심은 크게 아래와 같이 볼 수 있다.
- 실패율을 담은
List
내림차순으로 정렬하기- 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은
0
으로 정의하기
failureRate
를 선언한다.0
으로 정의한다.🔥 compare() 메소드를 사용하여 오름차순으로 정렬할 경우
첫번째 파라미터 > 두번째 파라미터 이면 양수
첫번째 파라미터 < 두번째 파라미터이면 음수
같으면 0 을 리턴한다.
반면 ‘내림차순’으로 정렬 할 경우 양수와 음수를 반대로 리턴하면 된다.
import java.util.ArrayList;
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
ArrayList<double[]> failureRate = new ArrayList<double[]>();
// 실패율 구하기
for(int i = 1; i <= N; i++) {
double arrive = 0;
int clear = 0;
for(int j = 0; j < stages.length; j++) {
if(stages[j] >= i) {
if(stages[j] == i) arrive++;
clear++;
}
}
// 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의
if(clear == 0) {
failureRate.add(new double[] {i, 0});
continue;
}
failureRate.add(new double[] {i, arrive/clear});
}
//직접 정의해서 정렬하기는 방법은 아래에 따로 정리!
// 실패율 내림차순으로 정렬하기
failureRate.sort((a, b) -> Double.compare(b[1], a[1]));
// 출력
for(int i = 0; i < N; i++) {
answer[i] = (int)failureRate.get(i)[0];
//System.out.println((int)failureRate.get(i)[0] + "/" + failureRate.get(i)[1]);
}
return answer;
}
}
💡 람다식이 아닌 직접 정의해서 정렬해보기
import java.util.Collections;
Comparator<double[]> comparator = new Comparator<double[]>() {
@Override
public int compare(double[] o1, double[] o2) {
if(o1[1] > o2[1]) {
return -1; // 내림차순일 경우 음수
} else if(o1[1] == o2[1]) {
return 0;
} else {
return 1; // 내림차순일 경우 양수
}
}
};
Collections.sort(failureRate, comparator);
📚 참고 사이트