정렬조건이 어렵지 않아서 Comparable을 이용해서 접근했다.
승률, 자신보다체중이 많이 나가는 상대에게 이긴 횟수, 체중, 번호를 가지고 있는 클래스를 만들고, 그 클래스를 자료형으로 가지는 ArrayList를 생성해 Boxer들을 넣어준다.
자신보다 체중이 많은 사람들에게 이긴횟수는 따로 method를 빼서 처리했다.
다 넣었다면 Collections.sort를 이용하여 정렬하면 끝난다.
정렬조건은 승률이 제일 높은사람 > 자신보다 체중이 많이 나가는 상대에게 이긴 횟수가 많은 순서 > 체중이 큰 순서대로 > 번호가 작은 사람이다.
각 조건 순서대로 compareTo를 이용하여 구현하였다.
import java.util.*;
class Boxer implements Comparable<Boxer>{
double winnum = 0;
int swinnum =0;
int weight = 0;
int idx;
public Boxer(double winnum,int swinnum, int weight,int idx){
this.winnum = winnum;
this.swinnum = swinnum;
this.weight = weight;
this.idx = idx;
}
public int compareTo(Boxer o){
if(o.winnum-winnum>0){
return 1;
}else if(o.winnum-winnum<0){
return -1;
}else{
if(o.swinnum-swinnum>0){
return 1;
}else if(o.swinnum - swinnum<0){
return -1;
}else{
if(o.weight -weight>0){
return 1;
}else if(o.weight - weight<0){
return -1;
}else{
if(o.idx - idx<=0){
return 1;
}else{
return -1;
}
}
}
}
}
public String toString(){
return "boxer "+idx+"번 "+winnum+"승, 체중많은 사람한테 "+swinnum+"승";
}
}
class Solution {
public int[] solution(int[] weights, String[] head2head) {
int[] answer = new int[weights.length];
List<Boxer>boxerlist = new ArrayList();
for(int i=0; i<answer.length; i++){
int pan = head2head[i].replace("N","").length();
int wincount = head2head[i].replace("N","").replace("L","").length();
if(pan==0){
boxerlist.add(new Boxer(0,checkwinnum(i,weights,head2head[i]),weights[i],i+1));
}else{
double winrate = ((double)wincount/pan);
boxerlist.add(new Boxer(winrate,checkwinnum(i,weights,head2head[i]),weights[i],i+1));
}
//boxerlist.add(new Boxer(wincount,checkwinnum(i,weights,head2head[i]),weights[i],i+1));
}
Collections.sort(boxerlist);
//System.out.println(boxerlist);
for(int i=0; i<weights.length; i++){
answer[i] = boxerlist.get(i).idx;
}
return answer;
}
public int checkwinnum(int idx, int[] weights, String head2head){
int nowWeight = weights[idx];
int cnt =0;
String [] record = head2head.split("");
for(int i=0; i<weights.length; i++){
if(nowWeight<weights[i]){
if(record[i].equals("W")){
cnt++;
}
}
}
return cnt;
}
}