밀린 위클리 챌린지 해결하기..! 오늘은 프로그래머스 위클리챌린지 6주차 복서 정렬하기를 풀었다 !
복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.
weights | head2head | result |
---|---|---|
[50,82,75,120] | ["NLWL","WNLL","LWNW","WWLN"] | [3,4,1,2] |
[145,92,86] | ["NLW","WNL","LWN"] | [2,3,1] |
[60,70,60] | ["NNN","NNN","NNN"] | [2,1,3] |
복서 번호, 승률, 몸무게가 더 많이 나가는 복서를 이긴 횟수, 복서 몸무게로 이루어진 클래스를 만들어 사용하였습니다. 이는 정렬 조건을 보고, 정렬에 필요한 요소들을 담은 클래스입니다.
head2head와 weights 배열을 반복하면서 각 복서에 대해서 위의 정보를 담은 객체를 생성하여 리스트에 담아주었습니다. 이 때, 복서 번호와 몸무게는 배열의 인덱스와 weights 배열에 저장된 값을 이용하면 됩니다. 승률과 몸무게가 더 많이 나가는 복서를 이긴 횟수는 N이 아닌, 즉 총 경기수를 카운트하고, 이긴 경기는 따로 카운트해서 승률을 계산하여 주었고, 이긴 경기일 때에는 상대의 몸무게와 현 복서의 몸무게를 비교하여 해당 속성 카운트를 증가시켜주었다 ! 모든 복서와 경기를 하지 않았을 수도 있기 때문에 0으로 나누지 않도록 예외 처리를 해주어야 한다 !
후에 주어진 정렬 조건에 맞게 compare를 정의해서 리스트를 정렬해주고 정렬된 순서대로 복서 번호를 결과 배열에 넣어주면 된다 !
import java.util.*;
class Solution {
public static class Data{
private int index;
private double winRate;
private int winOverWeight;
private int myWeight;
Data(int index, int myWeight){
this.index = index;
winRate = 0.0;
winOverWeight = 0;
this.myWeight = myWeight;
}
}
public int[] solution(int[] weights, String[] head2head) {
int[] answer = new int[weights.length];
ArrayList<Data> boxers = new ArrayList<>();
double count, win;
for(int i=0; i<head2head.length; i++){
boxers.add(new Data(i+1, weights[i]));
count = 0;
win = 0;
for(int j=0; j<head2head[i].length(); j++){
if(head2head[i].charAt(j) == 'W'){
count++;
win++;
if(weights[j] > weights[i]) boxers.get(i).winOverWeight++;
}
else if(head2head[i].charAt(j) == 'L') count++;
}
if(count!=0) boxers.get(i).winRate = win/count;
}
Collections.sort(boxers, new Comparator<>(){
@Override
public int compare(Data o1, Data o2){
if(o1.winRate == o2.winRate){
if(o1.winOverWeight == o2.winOverWeight){
return o2.myWeight-o1.myWeight;
}
else return o2.winOverWeight-o1.winOverWeight;
}
else{
if(o2.winRate > o1.winRate) return 1;
else return -1;
}
}
});
for(int i=0; i<boxers.size(); i++){
answer[i] = boxers.get(i).index;
}
return answer;
}
}