[Algorithm] 프로그래머스 - 복서 정렬하기 (JS)

정관우·2021년 9월 8일
1
post-thumbnail

문제

복서 선수들의 몸무게(weight)전적(head2head)을 매개변수로 받아, 아래와 같은 조건으로 선수 번호를 정렬한 후 리턴해야하는 문제

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

문제 링크

입출력 예시

let output1 = solution([50, 82, 75, 120], ["NLWL", "WNLL", "LWNW", "WWLN"]); // -> [3,4,1,2]
console.log(output1);

let output2 = solution([145, 92, 86], ["NLW", "WNL", "LWN"]); // -> [2,3,1]
console.log(output2);

let output3 = solution([60, 70, 60], ["NNN", "NNN", "NNN"]); // -> [2,1,3]
console.log(output3);

풀이 방법

각 선수들의 필요한 정보들을 하나의 배열 안에 담아 이중배열을 만든 다음, 조건에 맞게 차례대로 sort를 해주는 식으로 문제를 풀었다. 배열 안에 담아야 하는 데이터는 다음과 같다.

  1. 선수의 승률
  2. 나보다 더 몸무게가 더 높은 선수를 이긴 횟수
  3. 나의 몸무게
  4. 선수 번호

이 순서대로 정보를 배열에 담아 조건에 맞게 정렬한 후, 선수 번호만 뽑아서 리턴해주었다.
이 풀이 방법을 코드로 구현하면 다음과 같다.

function solution(weights, head2head) {
    let result = [];

    for (let i = 0; i < weights.length; i++) {
        let win = 0;
        let lose = 0;
        let over = 0;
        // weights[i] => 선수의 몸무게
        // head2head[i] => 선수의 전적 (length가 같기 때문)
        // head2head[i][j] => 각 경기의 승패
        for (let j = 0; j < head2head[i].length; j++) {
            // N은 아무것도 하지 않음
            if (head2head[i][j] === "N") continue;
            if (head2head[i][j] === "L") lose++;
            if (head2head[i][j] === "W") {
                // weights[i] => 선수의 몸무게
                // weigths[j] => 대결 상대의 몸무게
                // 대결한 상대의 몸무게가 더 크면
                if (weights[i] < weights[j]) {
                    over++;
                }
                win++;
            }
        }
        // 승률
        let rate = win / (win + lose);
        // 각 선수의 정보를 한 배열 안에 담음
        result = [...result, [rate, over, weights[i], i + 1]];
    }

    // 배열을 정렬
    result.sort((a, b) => {
        // 승률 내림차순 정렬
        if (a[0] > b[0]) return -1;
        if (a[0] < b[0]) return 1;
        // 승률이 같으면?
        // 나보다 무거운 상대 이긴 횟수 내림차순 정렬
        if (a[1] > b[1]) return -1;
        if (a[1] < b[1]) return 1;
        // 나보다 무거운 상대 이긴 횟수가 같으면?
        // 몸무게 내림차순 정렬
        if (a[2] > b[2]) return -1;
        if (a[2] < b[2]) return 1;
        // 몸무게마저 같으면?
        // 선수 번호 오름차순 정렬
        if (a[3] > b[3]) return 1;
        if (a[3] < b[3]) return -1;
        return 0;
    })

    // 정렬된 배열에서 선수 번호만 매핑
    return result.map(el => el[3]);
}
profile
작지만 꾸준하게 성장하는 개발자🌳

0개의 댓글