알고리즘 공부/위클리 챌린지

프로그래머스 위클리 챌린지 6주차 - java

철매존 2021. 9. 6. 21:36
728x90

문제 설명

1. 복서의 몸무게, 전적이 주어진다.

2. W(이김), L(짐), N(경기안함) 이고, 경기를 안하면 체크하지 않는다.

3. 승률 - 자기보다 무거운사람을 이긴 횟수 - 자기 몸무게 의 순서로 동률이면 뒤의 것을 고려하여 rank를 return하면 된다.

풀이 과정

 1. 이것도 정렬을 사용하면 매우 간단한 문제이다...사실 시간복잡도에서 걸릴 것 같았는데 어째 통과가 되었다.

 2. 전체경기수, 이긴수를 구하서 승률 / 자기보다 무거운 사람 이긴 수 / 자기 몸무게를 배열에 저장한다.

 3. compare의 로직을 이용하여 간단하게 순서대로 정렬하면 구해진다.

 4. 노드별 compare구현하기~

코드

import java.util.*;

class Solution {
    public int[] solution(int[] weights, String[] head2head) {
        int leng = weights.length;
        int[] answer = new int[leng];
        double rank[][] = new double[leng][4]; // 0:승률 1:자기보다무거운사람이긴횟수 2:자기몸무게 3:본인위치-1
        
        for(int i=0; i<leng; i++){
            int cnt = leng;   // 전체 게임 횟수이다.
            int wins = 0;     // 이긴 횟수이다.
            rank[i][2] = weights[i];    // 본인 몸무게 기입
            rank[i][3] = i;             // 본인 순서-1(배열은 0부터시작이니까)
            for(int j=0; j<leng; j++){
                if(i==j || head2head[i].charAt(j) == 'N') cnt--;    // 게임을 안하면 게임횟수 하나 뺌.
                else if(head2head[i].charAt(j) == 'W'){             // 이겼으면
                    if(weights[i] < weights[j]) rank[i][1]++;       // 니보다 무거운경우 1번 node의 수를 늘려줌
                    wins++;   // 이길때마다 wins++
                } 
            }
            if(cnt!=0)rank[i][0] = (double)wins/cnt;    // 승률은 이긴횟수/전체게임    참고로 한판도 안했으면 배열은 0으로 초기화되므로 냅두면 된다.
        }
        
        Arrays.sort(rank, (o1, o2) -> {   // 승률, 자기보다 무거운사람 이긴 횟수, 자기 몸무게 순서대로 다중 정렬한다.
            if(o1[0] == o2[0]){ // 승률이 같은경우
                if(o1[1] == o2[1])  // 자기보다 무거운사람 이긴 횟수가 같은 경우
                    return Double.compare(o2[2], o1[2]);    // 몸무게대로 정렬
                else
                    return Double.compare(o2[1], o1[1]);    // 자기보다 무거운 사람 이긴 횟수로 정렬
            }else{
                return Double.compare(o2[0], o1[0]);    // 몸무게별 정렬
            }
        });
        
        for(int i=0; i<leng; i++){
            answer[i] = 1 + (int)rank[i][3];    // 그래서 그 위치를 구해주면 됨.
        }
        return answer;
    }
}