import java.util.*;
class Solution {
static class Rate{
int idx;
double rate;
public Rate(int idx, double rate){
this.idx = idx;
this.rate = rate;
}
}
public int[] solution(int N, int[] stages) {
int[] failCnt = new int[N+1];
int[] passCnt = new int[N+1];
// failCnt, passCnt 갱신
for(int el : stages){
if(el>N){
for(int i=1; i<el; i++){
passCnt[i]+=1;
}
continue;
}
failCnt[el]+=1;
for(int i=1; i<=el; i++){
passCnt[i]+=1;
}
}
List<Rate> rates = new ArrayList<>();
for(int i=1; i<N+1; i++){
if(failCnt[i] == 0){
Rate rate = new Rate(i,0);
rates.add(rate);
continue;
}
Rate rate = new Rate(i,(double)failCnt[i]/passCnt[i]);
rates.add(rate);
}
Collections.sort(rates,(o1,o2)->Double.compare(o2.rate,o1.rate));
int[] ans = new int[N];
for(int i=0; i<ans.length; i++){
ans[i] = rates.get(i).idx;
}
for(Rate curRate : rates){
System.out.println("Idx = "+curRate.idx+" rate = "+curRate.rate);
}
System.out.print("fails = ");
for(int el : failCnt){
System.out.print(el+" ");
}
System.out.println();
System.out.print("pass = ");
for(int el : passCnt){
System.out.print(el+" ");
}
System.out.println();
return ans;
}
}
구조가 있는 경우 객체를 선언해서 처리하자 -> Rate class 정의
import java.util.*;
import java.util.stream.Collectors;
class Solution {
class StageInfo implements Comparable{
public int stageNum = 0;
public int arrived=0;
public int notCleared = 0;
public StageInfo(int stageNum){
this.stageNum = stageNum;
}
@Override
public int compareTo(Object o){
StageInfo s = (StageInfo) o;
if(this.getRatio() > s.getRatio()) return -1;
else if(this.getRatio() == s.getRatio()){
return this.stageNum - s.stageNum;
}else{
return 1;
}
}
public double getRatio(){
if(arrived ==0) return 0;
return (double) notCleared / (double) arrived;
}
}
public int[] solution(int N, int[] stages) {
List<StageInfo> list = new ArrayList<>();
// stage 리스트 초기화
for(int i=0; i<N; i++){
list.add(new StageInfo(i+1));
}
int listSize= list.size();
for(int stage : stages){
if (stage == N+1){
for(int i=0; i<list.size(); i++){
StageInfo cur = list.get(i);
cur.arrived+=1;
}
continue;
}
for(int i=0; i<stage;i++){
StageInfo cur = list.get(i);
cur.arrived+=1;
if(i == stage-1) cur.notCleared +=1;
}
}
Collections.sort(list);
int[] answer = new int[listSize];
for(int i=0; i<listSize; i++){
answer[i] = list.get(i).stageNum;
}
return answer;
}
}
Comparable.compareTo(Object o) 반환값:
a>b 일때 양수 반환: 오름차순
음수 반환: 내림차순