반응형
문제주소 : https://programmers.co.kr/learn/courses/30/lessons/85002#
<문제 설명>
더보기
문제 설명
복서 선수들의 몸무게 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'입니다.
입출력 예
weightshead2headresult[50,82,75,120] | ["NLWL","WNLL","LWNW","WWLN"] | [3,4,1,2] |
[145,92,86] | ["NLW","WNL","LWN"] | [2,3,1] |
[60,70,60] | ["NNN","NNN","NNN"] | [2,1,3] |
입출력 예 설명
입출력 예 #1
- 다음은 선수들의 정보를 나타낸 표입니다.
1번 | - | 패배 | 승리 | 패배 | 33.33% | 1회 | 50kg |
2번 | 승리 | - | 패배 | 패배 | 33.33% | 0회 | 82kg |
3번 | 패배 | 승리 | - | 승리 | 66.66% | 2회 | 75kg |
4번 | 승리 | 승리 | 패배 | - | 66.66% | 0회 | 120kg |
- 본문에 서술된 우선순위를 따라 [3,4,1,2] 를 return 합니다.
입출력 예 #2
- 다음은 선수들의 정보를 나타낸 표입니다.
1번 | - | 패배 | 승리 | 50% | 0회 | 145kg |
2번 | 승리 | - | 패배 | 50% | 1회 | 92kg |
3번 | 패배 | 승리 | - | 50% | 1회 | 86kg |
- 본문에 서술된 우선순위를 따라 [2,3,1] 을 return 합니다.
입출력 예 #3
- 다음은 선수들의 정보를 나타낸 표입니다.
1번 | - | - | - | 0% (무전적) | 0회 | 60kg |
2번 | - | - | - | 0% (무전적) | 0회 | 70kg |
3번 | - | - | - | 0% (무전적) | 0회 | 60kg |
- 본문에 서술된 우선순위를 따라 [2,1,3] 을 return 합니다.
<풀이법>
▒ 한줄 개념: 정렬 ▒
사실상 정렬이 주요한 알고리즘이 되는 문제입니다.
데이터를 만들고, 4가지 조건에 따라 정렬하면 됩니다.
데이터를 생성하는 방식은 여러가지가 있겠지만, 저는 Javascript를 사용하였으므로 객체 배열을 생성하여 데이터를 만들어주었습니다.
각 객체에 필요한 값은 {자신의 번호, 자신의 무게, 무거운 사람을 이긴 횟수, 전체 승률} 입니다.
weights와 head2head에 대해 반복문을 통해 순서대로 해당 값들을 계산하여 전체 값들을 가진 하나의 리스트를 만들어줍니다. 그 후, 다음과 같은 순서로 배열을 정렬해주면 됩니다.
1. 전체 승률 내림차순
2. 무거운 사람 이긴 횟수 내림차순
3. 자신의 무게 내림차순
4. 선수 번호 오름차순
정렬을 완료했으면, 배열 순서대로 선수 번호 값을 뽑아 +1 하고, 이를 모아서 반환해주면 됩니다.
<코드(Javascript)>
function solution(weights, head2head) {
const data = [];
weights.map((w, i) => { // 데이터 생성부
let winningHeavier = 0;
let winningCount = 0;
let totalFightCount = 0;
const log = head2head[i].split('');
log.map((result, j) => {
if(result !== 'N'){
totalFightCount++;
if(result === 'W'){
if(weights[i] < weights[j]){
winningHeavier++;
}
winningCount++;
}
}
});
const winningRate = totalFightCount ? winningCount / totalFightCount : 0;
data.push({ // 현재 선수의 데이터 생성하여 배열에 push
idx: i,
weight: w,
winningHeavier,
winningRate
})
})
data.sort((a,b) => { // 정렬
if(a.winningRate !== b.winningRate){ // 1. 전체 승률 내림차순
return - (a.winningRate - b.winningRate);
}else if(a.winningHeavier !== b.winningHeavier){ // 2. 무거운 사람 이긴 수 내림차순
return - (a.winningHeavier - b.winningHeavier);
}else if(a.weight !== b.weight){ // 3. 자신의 무게 내림차순
return - (a.weight - b.weight);
}else{ // 4. 인덱스 오름차순
return a.idx - b.idx;
}
});
return data.reduce((ans, d) => { // 각 인덱스 값을 +1 하여 반환
ans.push(d.idx+1);
return ans;
}, []);
}
더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest
반응형
'Programmers' 카테고리의 다른 글
[프로그래머스] 입실 퇴실 / Javascript (위클리 챌린지 7주차) (0) | 2021.09.14 |
---|---|
[프로그래머스] 매출 하락 최소화 / Javascript (+반례) (0) | 2021.09.07 |
[프로그래머스] 표 편집 / Javascript (0) | 2021.09.02 |
[프로그래머스] 거리두기 확인하기 / Javascript (0) | 2021.09.01 |
[프로그래머스] 숫자 문자열과 영단어 / Javascript (0) | 2021.09.01 |