1) 문제 접근 방법
- 각 스테이지마다, 해당 스테이지에 도달한 값을 카운트해주고,
그 다음에 해당 스테이지보다 크거나 같은 값을 total에 더해준 후에,
두 값으로 실패율을 구해서 ArrayList에 저장한다.
- ArrayList에 저장할 때는, 인덱스와 실패율을 Pair로 만들어서 저장한다.
- 그 다음에 실패율을 기준으로 내림차순 정렬을 하기 위해서,
Collecitons.sort(arr, (o1, o2) -> Double.compare(o2.rate, o1.rate));를 해준다.
- 여기서 중요한 것이, 스테이지에 도달한 유저가 없는 경우에는, 해당 스테이지의 실패율은 0으로 정의해야 하는데,
이 케이스를 따로 분리해줘야 한다.
- 그 다음에 내림차순 정렬 순서의 인덱스를 결과에 저장해준다.
import java.util.*;
// 인덱스와 실패율을 저장하기 위한 Pair 클래스를 선언합니다.
class Pair{
int idx;
double rate;
public Pair(int idx, double rate){
this.idx = idx;
this.rate = rate;
}
}
class Solution {
public int[] solution(int N, int[] stages) {
int[] answer = new int[N];
ArrayList<Pair> arr = new ArrayList<>();
int curr = 1;
while(true){
if(curr == N+1){
break;
}
int cnt = 0;
int total = 0;
// 현재 스테이지에서의 도달했으나 클리어하지 못한 플레이어의 수 cnt와
// 스테이지에 도달한 플레이어의 수 total을 각각 구해준다.
for(int i=0; i<stages.length; i++){
if(stages[i] == curr){
cnt++;
}
if(stages[i] >= curr){
total++;
}
}
// System.out.println("cnt, total은?" + cnt + " " + total);
double rate = 0;
// total이 0인 경우는, 스테이지에 도달한 유저가 없는 경우이므로
// 실패율을 0으로 정의한다.
// 반대로 total이 아닌 경우는 cnt, total을 double로 변환해서
// rate에 저장한다.
if(total == 0){
rate = 0;
}else{
rate = (double)cnt/(double)total;
}
// arr에 Pair를 추가한다.
arr.add(new Pair(curr, rate));
// 다음 스테이지로 이동한다.
curr++;
}
// Collections를 rate 기준으로 내림차순 sort해준다.
Collections.sort(arr, (o1, o2) -> Double.compare(o2.rate, o1.rate));
// answer에 최종적으로 내림차순 정렬된 값을 저장한다.
for(int i=0; i<arr.size(); i++){
// System.out.println("idx, rate" + arr.get(i).idx + " " + arr.get(i).rate);
answer[i] = arr.get(i).idx;
}
return answer;
}
}'PS' 카테고리의 다른 글
| 뉴스 클러스터링 [프로그래머스] (0) | 2023.06.03 |
|---|---|
| 다트 게임 [프로그래머스] (1) | 2023.06.03 |
| 오픈채팅방 [프로그래머스] (0) | 2023.06.03 |
| 알파벳 [BOJ 1987] (0) | 2022.10.10 |
| 테트로미노 [BOJ 14500] (0) | 2022.10.08 |