IT/Algorithm

프로그래머스) 복서 정렬하기

프티 2021. 10. 13. 00:00
반응형

https://programmers.co.kr/learn/courses/30/lessons/85002

 

코딩테스트 연습 - 6주차_복서 정렬하기

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

programmers.co.kr

 

나의 풀이

function solution(weights, head2head) {
    const objList = [];
    const answer = [];

    head2head.forEach(function (strScore, strIndex) {
        let winMoreWeight = 0;
        let obj = {};

        strScore.split("").forEach(function (oneScore, oneScoreIndex) {
            if (oneScore === "W" && weights[strIndex] < weights[oneScoreIndex]) {
                winMoreWeight += 1;
            }
        });

        obj.winCount = strScore.split("").filter(winCount => winCount === "W").length / strScore.split("").filter(winCount => winCount !== "N").length;
        obj.winWeighterCount = winMoreWeight;
        obj.weight = weights[strIndex];
        obj.index = strIndex;

        objList.push(obj);
    });

    objList.sort(function (a, b) {
        if (a.winCount < b.winCount) {
            return 1;
        } else if (a.winCount > b.winCount) {
            return -1;
        }

        if (a.winWeighterCount < b.winWeighterCount) {
            return 1;
        } else if (a.winWeighterCount > b.winWeighterCount) {
            return -1;
        }

        if (a.weight < b.weight) {
            return 1;
        } else if (a.weight > b. weight) {
            return -1;
        }

        if (a.index < b.index) {
            return -1;
        } else if (a.index > b.index) {
            return 1;
        }

        return 0;
    });

    objList.forEach((objEle, index) => {
        answer.push(objEle.index + 1);
    });

    return answer;
}

승률과 몸무게가 더 나가는 복서를 이긴 횟수를 구하고,

새로운 객체 obj에 승률, 횟수, 몸무게, 번호 정보를 담았다.

 

그것을 objList에 넣어서 순위 내림차순을 sort 하였고,

마지막에 복서의 번호만 추출하여 answer 배열에 넣고 반환하였다.

 

승률의 경우 변수가 winCount인 것이 잘못되었지만 테스트를 확인하다가 그만 제출해버렸다 ㅠㅠ

 

그리고 코드가 전반적으로 긴 것 같다.

 

다른 사람의 풀이

function solution(weights, head2head) {
    return head2head.map((l, i) => l.split('').reduce((acc, v, j) => {
                acc[0] += v === 'W' ? 1 : 0;
                acc[1] += v === 'W' ? weights[i] < weights[j] ? 1 : 0 : 0;
                acc[2] += v === 'L' ? 1 : 0
                return acc;
            }, [0, 0, 0])
            )
            .map((v) => [v[0] / (v[0] + v[2]), v[1]])
            .map((v, i) => [i + 1, {t: v[0], s: v[1], w : weights[i]}])
            .sort((a, b) => b[1].t - a[1].t || b[1].s - a[1].s || b[1].w - a[1].w || a[0] - b[0])
            .map((v) => v[0]);
}

 

이 코드에서는 acc = [0, 0, 0]에 이긴 횟수, 자기보다 몸무게가 더 나가는 복서를 이긴 횟수, 진 횟수를 저장하고 있다.

 

이것을 다시 승률, 몸무게가 더 나가는 복서를 이긴 횟수로 변환하고,

다시 [ 번호, { 승률, 몸무게가 더 나가는 복서를 이긴 횟수, 몸무게 } ]로 변환한다.

 

다시 sort로 정렬해주는데 콜백 함수에서 || 연산자를 사용함으로써 순서의 4가지 조건을 모두 충족하고 있는 점이 눈에 띄었다.

 

그렇게 정렬된 것 중 번호만 빼내어 반환함으로 마무리된다.

 

지난번 풀어보았던 상호 평가에서부터 map의 활용성에 대해 또다시 알게 되었지만 실제 내 코드에 적용하기 쉽지 않았다.

 

그리고 sort 메서드에 들어가는 콜백 함수를 간결하게 작성해보아야겠다는 생각이 들었다.

반응형

'IT > Algorithm' 카테고리의 다른 글

Queue에 대해서  (0) 2021.10.13
Stack 스택이란?  (0) 2021.10.13
프로그래머스) 상호 평가  (0) 2021.10.08
Quick Sort  (0) 2021.10.08
프로그래머스) [1차] 다트 게임  (0) 2021.10.06