728x90
( 위클리 챌린지 / 6주차_복서 정렬하기 )
[문제]
문제 설명
복서 선수들의 몸무게 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'입니다.
입출력 예시
weights | head2head | result |
[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
- 다음은 선수들의 정보를 나타낸 표입니다.
선수 번호 | vs 1번 | vs 2번 | vs 3번 | vs 4번 | 승률 | 자기보다 무거운 복서를 이긴 횟수 | 몸무게 |
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
- 다음은 선수들의 정보를 나타낸 표입니다.
선수 번호 | vs 1번 | vs 2번 | vs 3번 | 승률 | 자기보다 무거운 복서를 이긴 횟수 | 뭄무게 |
1번 | - | 패배 | 승리 | 50% | 0회 | 145kg |
2번 | 승리 | - | 패배 | 50% | 1회 | 92kg |
3번 | 패배 | 승리 | - | 50% | 1회 | 86kg |
- 본문에 서술된 우선순위를 따라 [2,3,1] 을 return 합니다.
입출력 예 #3
- 다음은 선수들의 정보를 나타낸 표입니다.
선수 번호vs 1번vs 2번vs 3번승률자기보다 무거운 복서를 이긴 횟수몸무게
선수 번호 | vs 1번 | vs 2번 | vs 3번 | 승률 | 자기보다 무거운 복서를 이긴 횟수 | 뭄무게 |
1번 | - | - | - | 0% (무전적) | 0회 | 60kg |
2번 | - | - | - | 0% (무전적) | 0회 | 70kg |
3번 | - | - | - | 0% (무전적) | 0회 | 60kg |
- 본문에 서술된 우선순위를 따라 [2,1,3] 을 return 합니다.
[코드]
자바
import java.util.ArrayList;
import java.util.Collections;
class Solution {
class Player implements Comparable<Player>{
double winRate;
int weightWin;
int weight;
int num;
public Player(double winRate, int weightWin, int weight, int num){
this.winRate = winRate;
this.weightWin = weightWin;
this.weight = weight;
this.num = num;
}
@Override
public int compareTo(Player o){
int compareValue = Double.compare(o.winRate, this.winRate);
if(compareValue != 0) return compareValue;
compareValue = Integer.compare(o.weightWin, this.weightWin);
if(compareValue != 0) return compareValue;
compareValue = Integer.compare(o.weight, this.weight);
if(compareValue != 0) return compareValue;
return Integer.compare(this.num, o.num);
}
}
public int[] solution(int[] weights, String[] head2head) {
int[] answer = new int[weights.length];
ArrayList<Player> arr = new ArrayList<>();
int len = weights.length;
for(int i = 0; i < len; i++){
int wCnt = 0;
int wmCnt = 0;
int weightWin = 0;
for(int j = 0; j < len; j++){
if(head2head[i].charAt(j) == 'N') continue;
wmCnt++;
if(head2head[i].charAt(j) == 'W'){
wCnt++;
if(weights[i] < weights[j]) weightWin++;
}
}
arr.add(new Player(wmCnt == 0 ? 0 : (double)wCnt / wmCnt, weightWin, weights[i], i+1));
}
Collections.sort(arr);
for(int i = 0; i < arr.size(); i++) answer[i] = arr.get(i).num;
return answer;
}
}
코틀린
class Solution {
fun solution(weights:IntArray, head2head:Array<String>):IntArray{
data class Player(val winRate:Double, val weightWin:Int, val weight:Int, val num:Int):Comparable<Player>{
override fun compareTo(other: Player): Int {
var compareValue = other.winRate.compareTo(this.winRate)
if(compareValue != 0) return compareValue
compareValue = other.weightWin.compareTo(this.weightWin)
if(compareValue != 0) return compareValue
compareValue = other.weight.compareTo(this.weight)
if(compareValue != 0) return compareValue
return this.num.compareTo(other.num)
}
}
val arr = mutableListOf<Player>();
for(i in weights.indices){
var gameCnt = 0
var winCnt = 0
var winWCnt = 0
for(j in head2head[i].indices){
if(head2head[i][j] == 'N') continue
gameCnt++
if(head2head[i][j] == 'W'){
winCnt++
if(weights[i] < weights[j]) winWCnt++
}
}
arr.add(Player(if(gameCnt == 0) 0.0 else winCnt.toDouble() / gameCnt, winWCnt, weights[i], i + 1))
}
return arr.sorted().map { it.num }.toIntArray()
}
}
제가 잘못 알고 있거나 잘못된 부분이 있을 경우 알려주시고 추가로 궁금한 점 있으신 분들도 댓글이나 메일 주시면 성실히 답변해 드리겠습니다.🧑🏻💻
감사합니다~😄
728x90
'Algorithm > level1' 카테고리의 다른 글
[ 프로그래머스 - MySQL ] 어린 동물 찾기 ( MySQL ) (0) | 2021.10.08 |
---|---|
[ 프로그래머스 - Java & Kotlin ] 최소직사각형 ( 자바 & 코틀린 ) (0) | 2021.10.08 |
[ 프로그래머스 - Java & Kotlin ] 2주차_상호평가 ( 자바 & 코틀린 ) (0) | 2021.10.08 |
[ 프로그래머스 - MySQL ] 동물의 아이디와 이름 ( MySQL ) (0) | 2021.10.06 |
[ 프로그래머스 - Java & Kotlin ] 1주차_부족한 금액 계산하기 ( 자바 & 코틀린 ) (0) | 2021.10.06 |