본문 바로가기

Algorithm/Programmers

[Java] 2021 위클리 챌린지 6주차 - 복서 정렬하기

복서들의 승패 정보를 가지고 정렬을 하면 되는 문제이다. 

  1. 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
  2. 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
  3. 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
  4. 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.

위 4가지 조건으로 정렬을 시키면 된다. 그래서 복서의 정보를 담을 class를 선언해주고, 해당 값들을 저장한다. 승률의 경우 플레이한 게임의 수가 0인 경우에 0/0 이 되지 않도록 주의를 기울이면 쉽게 해결이 가능하다. List API의 sort 를 이용하여 정렬을 하였다. 

import java.util.ArrayList;
import java.util.List;

class Player {
    int id;
    int weight;
    int numWin;
    int numGame;
    int numWinOverWeight;
    double winRate;

    public Player(int id, int weight) {
        this.id = id;
        this.weight = weight;
        this.numWin = 0;
        this.numGame = 0;
        this.numWinOverWeight = 0;
    }
}

class Solution {
    public int[] solution(int[] weights, String[] head2head) {

        int n = weights.length;
        List<Player> players = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            players.add(new Player(i + 1, weights[i]));
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (head2head[i].charAt(j) != 'N') {
                    players.get(i).numGame++;
                }
                if (head2head[i].charAt(j) == 'W') {
                    players.get(i).numWin++;
                    if (players.get(j).weight > players.get(i).weight) {
                        players.get(i).numWinOverWeight++;
                    }
                }
            }
        }
        players.stream().forEach(a -> {
            if (a.numGame > 0) {
                a.winRate = (double) a.numWin / a.numGame;
            }
        });

        players.sort((a, b) -> {
            if (a.winRate != b.winRate) {
                return (b.winRate - a.winRate) > 0 ? 1 : -1;
            } else if (a.numWinOverWeight != b.numWinOverWeight) {
                return b.numWinOverWeight - a.numWinOverWeight;
            } else if (a.weight != b.weight) {
                return b.weight - a.weight;
            } else {
                return a.id - b.id;
            }
        });

        return players.stream().mapToInt(a -> a.id).toArray();

    }
}
반응형