[알고리즘 문제풀이] 프로그래머스 위클리챌린지 6주차 복서 정렬하기

고럭키·2021년 9월 14일
0

알고리즘 문제풀이

목록 보기
56/68

밀린 위클리 챌린지 해결하기..! 오늘은 프로그래머스 위클리챌린지 6주차 복서 정렬하기를 풀었다 !

문제 설명

복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.

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

제한 사항

  • weights의 길이는 2 이상 1,000 이하입니다.
    • weights의 모든 값은 45 이상 150 이하의 정수입니다.
    • weights[i] 는 i+1번 복서의 몸무게(kg)를 의미합니다.
  • head2head의 길이는 weights의 길이와 같습니다.
    • head2head의 모든 문자열은 길이가 weights의 길이와 동일하며, 'N', 'W', 'L'로 이루어진 문자열입니다.
    • head2head[i] 는 i+1번 복서의 전적을 의미하며, head2head[i][j]는 i+1번 복서와 j+1번 복서의 매치 결과를 의미합니다.
      - 'N' (None)은 두 복서가 아직 붙어본 적이 없음을 의미합니다.
      - 'W' (Win)는 i+1번 복서가 j+1번 복서를 이겼음을 의미합니다.
      - 'L' (Lose)는 i+1번 복사가 j+1번 복서에게 졌음을 의미합니다.
    • 임의의 i에 대해서 head2head[i][i] 는 항상 'N'입니다. 자기 자신과 싸울 수는 없기 때문입니다.
    • 임의의 i, j에 대해서 head2head[i][j] = 'W' 이면, head2head[j][i] = 'L'입니다.
    • 임의의 i, j에 대해서 head2head[i][j] = 'L' 이면, head2head[j][i] = 'W'입니다.
    • 임의의 i, j에 대해서 head2head[i][j] = 'N' 이면, head2head[j][i] = 'N'입니다.

입출력 예

weightshead2headresult
[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;
    }
}

0개의 댓글