복서 정렬하기

yonii·2021년 10월 8일
0

🔗문제 링크

구현 코드

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 정렬

profile
공부하려고 노력ing....

0개의 댓글