반응형
https://programmers.co.kr/learn/courses/30/lessons/85002
나의 풀이
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 |