프로그래머스 코딩 문제 2021/09/07 - Lv.1 복서 정렬하기
[문제]
복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
- 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
- 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
- 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
제한사항
-
weights의 길이는 2 이상 1,000 이하입니다.
-
- weights의 모든 값은 45 이상 150 이하의 정수입니다.
-
- weights[i] 는 i+1번 복서의 몸무게(kg)를 의미합니다.
-
head2head의 길이는 weights의 길이와 같습니다.
-
- head2head의 모든 문자열은 길이가 weights의 길이와 동일하며, 'N', 'W', 'L'로 이루어진 문자열입니다.
-
- head2head[i] 는 i+1번 복서의 전적을 의미하며, head2head[i][j]는 i+1번 복서와 j+1번 복서의 매치 결과를 의미합니다.
-
- 'N' (None)은 두 복서가 아직 붙어본 적이 없음을 의미합니다.
-
- 'W' (Win)는 i+1번 복서가 j+1번 복서를 이겼음을 의미합니다.
-
- 'L' (Lose)는 i+1번 복사가 j+1번 복서에게 졌음을 의미합니다.
-
- 임의의 i에 대해서 head2head[i][i] 는 항상 'N'입니다. 자기 자신과 싸울 수는 없기 때문입니다.
-
- 임의의 i, j에 대해서 head2head[i][j] = 'W' 이면, head2head[j][i] = 'L'입니다.
-
- 임의의 i, j에 대해서 head2head[i][j] = 'L' 이면, head2head[j][i] = 'W'입니다.
-
- 임의의 i, j에 대해서 head2head[i][j] = 'N' 이면, head2head[j][i] = 'N'입니다.
입출력 예
입출력 예 설명
입출력 예 #1
- 다음은 선수들의 정보를 나타낸 표입니다.
- 본문에 서술된 우선순위를 따라 [3,4,1,2] 를 return 합니다.
입출력 예 #2
- 다음은 선수들의 정보를 나타낸 표입니다.
- 본문에 서술된 우선순위를 따라 [2,3,1] 을 return 합니다.
입출력 예 #3
- 다음은 선수들의 정보를 나타낸 표입니다.
- 본문에 서술된 우선순위를 따라 [2,1,3] 을 return 합니다.
[풀이]
function solution(weights, head2head) {
var answer = [];
const data = weights.map((n, idx) => {
const obj = {};
obj['num'] = idx + 1; // 선수 번호
obj['weight'] = n; // 선수 몸무게
const total = head2head[idx]; // 각 선수 경기 전적
let winCount = 0; // 이긴 횟수
let winOverWeight = 0; // 자기보다 무거운 복서 이긴 횟수
let fightCount = 0; // 총 경기 횟수
for(let i = 0; i < total.length; i++) {
if(total[i] === 'W') {
winCount++;
fightCount++;
if(weights[i] > n) {
winOverWeight++;
}
}
else if(total[i] === 'L') {
fightCount++;
}
}
// 승률
obj['winRate'] = fightCount ? winCount / fightCount : 0;
// 자기보다 무거운 복서 이긴 횟수
obj['winOverWeight'] = winOverWeight;
return obj;
});
data.sort((a, b) => {
// 1. 승률 비교
if(a.winRate !== b.winRate) {
return b.winRate - a.winRate;
}
// 2. 자기보다 무거운 복서 이긴 횟수 비교
if(a.winOverWeight !== b.winOverWeight) {
return b.winOverWeight - a.winOverWeight;
}
// 3. 몸무게 비교
return b.weight - a.weight;
})
return data.map(obj => obj.num);
}
비교해야되는 조건이 승률, 자기보다 무거운 복서를 이긴 횟수, 자기 몸무게 이렇게 3가지가 있다.
우선 각 선수마다 저 3가지를 데이터로 객체를 만든다.
그리고 조건에 맞게 sort()
를 하는데 우선 순위에 따라 정렬한다.
- 승률
- 자기보다 무거운 복서를 이긴 횟수
- 자기 몸무게
1번 조건부터 비교해서 같으면 2번 조건, 2번 조건도 같으면 3번조건을 비교해서 정렬시키고 선수의 번호만 뽑아서 배열로 return
하면 된다.
Author And Source
이 문제에 관하여(프로그래머스 코딩 문제 2021/09/07 - Lv.1 복서 정렬하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@hemtory/Programmers20210907
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
function solution(weights, head2head) {
var answer = [];
const data = weights.map((n, idx) => {
const obj = {};
obj['num'] = idx + 1; // 선수 번호
obj['weight'] = n; // 선수 몸무게
const total = head2head[idx]; // 각 선수 경기 전적
let winCount = 0; // 이긴 횟수
let winOverWeight = 0; // 자기보다 무거운 복서 이긴 횟수
let fightCount = 0; // 총 경기 횟수
for(let i = 0; i < total.length; i++) {
if(total[i] === 'W') {
winCount++;
fightCount++;
if(weights[i] > n) {
winOverWeight++;
}
}
else if(total[i] === 'L') {
fightCount++;
}
}
// 승률
obj['winRate'] = fightCount ? winCount / fightCount : 0;
// 자기보다 무거운 복서 이긴 횟수
obj['winOverWeight'] = winOverWeight;
return obj;
});
data.sort((a, b) => {
// 1. 승률 비교
if(a.winRate !== b.winRate) {
return b.winRate - a.winRate;
}
// 2. 자기보다 무거운 복서 이긴 횟수 비교
if(a.winOverWeight !== b.winOverWeight) {
return b.winOverWeight - a.winOverWeight;
}
// 3. 몸무게 비교
return b.weight - a.weight;
})
return data.map(obj => obj.num);
}
비교해야되는 조건이 승률, 자기보다 무거운 복서를 이긴 횟수, 자기 몸무게 이렇게 3가지가 있다.
우선 각 선수마다 저 3가지를 데이터로 객체를 만든다.
그리고 조건에 맞게 sort()
를 하는데 우선 순위에 따라 정렬한다.
- 승률
- 자기보다 무거운 복서를 이긴 횟수
- 자기 몸무게
1번 조건부터 비교해서 같으면 2번 조건, 2번 조건도 같으면 3번조건을 비교해서 정렬시키고 선수의 번호만 뽑아서 배열로 return
하면 된다.
Author And Source
이 문제에 관하여(프로그래머스 코딩 문제 2021/09/07 - Lv.1 복서 정렬하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hemtory/Programmers20210907저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)