N

(프로그래머스 JS)위클리 챌린지 6주차 본문

프로그래머스 알고리즘/Weekly Challenge

(프로그래머스 JS)위클리 챌린지 6주차

naeunchan 2021. 9. 7. 10:00
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/85002?language=cpp 

 

코딩테스트 연습 - 6주차

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

programmers.co.kr

 

 

set과 map을 활용.

 

weightSet은 주어진 weights를 new Set을 통해 중복없이 몸무게를 순서대로 나열하고 스프레드 연산자를 이용해 다시 배열로 만들었다.

이를 통해 복서들의 몸무게 순위를 매길 수 있으며, weightsMap에 key를 몸무게, value를 등수로 매겼다.

 

이후 이중 for문을 통해 weights와 head2head를 순회.

정렬 우선순위가 '승률 > 자신보다 무거운 선수를 이긴 횟수 > 몸무게 순위 > 복서의 번호'이기 때문에

rating 배열에 차례대로 [rate, heavier, index, i]를 push.

 

rating을 우선순위대로 정렬을 하면 된다.

 

 

function solution(weights, head2head) {
    const answer = [];
    const weightsSet = [...new Set(weights)];
    const weightsMap = new Map();
    const rating = [];
    const length = weights.length;
    let rank = 0;
    
    weightsSet.sort((a, b) => a - b);
    
    weightsSet.forEach((w) => weightsMap.set(w, rank++));
    
    for(let i = 0; i < length; i++){
        let rate = 0; // 승률
        let total = length; // 복서가 경기를 뛴 횟수
        let win = 0; // 복서가 다른 복서를 이긴 횟수
        let heavier = 0; // 자신보다 무거운 복서를 이긴 횟수
        let weightIndex = weightsMap.get(weights[i]); // 현재 복서의 몸무게 순위
        
        for(let j = 0; j < length; j++){
            if(head2head[i][j] === "W"){
                if(weights[i] < weights[j]){
                    heavier++;
                }
                win++
            } else if(head2head[i][j] === "N"){
                total--;
            }
        }
        
        if(total === 0){
            rate = 0;
        } else{
            rate = win / total;
        }
        
        rating.push([rate, heavier, weightIndex, i]);
    }
    
    rating.sort((a, b) => {
        if(a[0] === b[0]){
            if(a[1] === b[1]){
                if(a[2] === b[2]){
                    return a[3] - b[3];
                }
                
                return b[2] - a[2];
            }
            
            return b[1] - a[1];
        } else{
            return b[0] - a[0];
        }
    });
    
    rating.forEach((rank) => answer.push(rank[3] + 1));
    
    return answer;
}
728x90
반응형