import java.util.*;
class Solution {
public int[] solution(int[] weights, String[] head2head) {
ArrayList<Boxer> list = new ArrayList<>();
for(int i=0;i<head2head.length;i++){
char[] game = head2head[i].toCharArray();
int heavy_win = 0;
Double win = 0.0;
int count = 0;
Boxer boxer = new Boxer(i,weights[i]);
for(int j=0;j<game.length;j++){
if(i!=j){
if(game[j]=='W'){//i복서가 j복서를 이겼음
if(weights[i]<weights[j]) heavy_win++;
win++;
count++;
}
else if(game[j]=='L'){//i복서가 j복서에게 졌음
count++;
}
}
}
boxer.heavy_win = heavy_win;
if(count!=0)
win = (win/count)*100;
boxer.win = win;
list.add(boxer);
}
Collections.sort(list);
int[] answer = new int[list.size()];
int index = 0;
for(Boxer b : list){
answer[index++] = b.num+1;
}
return answer;
}
static class Boxer implements Comparable<Boxer>{
@Override
public int compareTo(Boxer o){
if(o.win.compareTo(this.win)==0){
if(o.heavy_win == this.heavy_win){
if(o.weight == this.weight){
return this.num - o.num;
}
return o.weight - this.weight;
}
return o.heavy_win - this.heavy_win;
}
return o.win.compareTo(this.win);
}
int num;//번호
Double win=0.0;//승률
int weight;
int heavy_win=0;//자신보다 무거운 선수를 이긴 횟수
public Boxer(int num,int weight){
this.num = num;
this.weight = weight;
}
}
}
놓친 부분
1. 승률 계산
win = win/(game.length-1)100; 로 계산을 했는데
N인 경우는 승률 계산에 포함이 안되므로 game.length로 계산하면 안됨.
L과 W인 경우에만 카운트를 해서 그 값으로 승률계산해야함.
win = (win/count)100;
2. 정렬 기준 비교시 Double값 비교
Double 변수의 경우 ==로 비교하면 x
o.win.compareTo(this.win) == 0 이런식으로 compareTo를 쓰거나 equals를 써서 비교해야함.
이 두가지때문에 런타임에러 + 실패가 떴었음. 잡느라 삼십분은 쓴듯ㅠ 이번에 알았으니 됐다!
알고리즘
Boxer 클래스 정의 -> Comparable정의해서 조건에 맞는 정렬기준 세움
count : 승률 계산 위한 총 경기수
heavy_win: 자신보다 몸무게가 많이 나가는 선수를 이긴 횟수
list: 정렬위한 Boxer list
승패 for문 돌면서
W이나 L인 경우에만 count++
W인 경우 몸무게 체크하고 자신보다 무거운 선수 이겼으면 heavy_win++
list.add(boxer)
list 정렬