문제 설명
복서 선수들의 몸무게 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번승률자기보다 무거운 복서를 이긴 횟수몸무게
1번 | - | - | - | 0% (무전적) | 0회 | 60kg |
2번 | - | - | - | 0% (무전적) | 0회 | 70kg |
3번 | - | - | - | 0% (무전적) | 0회 | 60kg |
- 본문에 서술된 우선순위를 따라 [2,1,3] 을 return 합니다.
문제 풀이 생각
입출력 예제를 보고 복서마다 승률, 자기보다 무거운 복서를 이긴 횟수, 몸무게를 구해서 정렬하는 방법을 이용했다. 일단 배열안에 각 선수마다 필요한 정보를 저장하고 Arrays.sort를 람다식 comparator로 비교해서 정렬해주었다.
내 코드
import java.util.Arrays;
class Solution {
public int[] solution(int[] weights, String[] head2head) {
int[] answer = new int[weights.length];
double[][] array = new double[weights.length][4];
for (int i = 0; i < head2head.length; i++) {
double winCount = 0;
int count = 0;
int total = 0;
for (int j = 0; j < head2head[i].length(); j++) {
if (head2head[i].charAt(j) != 'N')
total++;
if (head2head[i].charAt(j) == 'W') {
winCount++;
if (weights[i] < weights[j]) {
count++;
}
}
}
array[i][0] = i + 1;
array[i][1] = (winCount != 0) ? winCount / total * 100000000 : 0;
System.out.println(array[i][1]);
array[i][2] = count;
array[i][3] = weights[i];
}
Arrays.sort(array, (o1, o2) -> {
if (o1[1] == o2[1] && o1[2] == o2[2] && o1[3] == o2[3])
return (int) (o1[0] - o2[0]);
else if (o1[1] == o2[1] && o1[2] == o2[2])
return (int) (o2[3] - o1[3]);
else if (o1[1] == o2[1])
return (int) (o2[2] - o1[2]);
else
return (int) (o2[1] - o1[1]);
});
for (int i = 0; i < answer.length; i++) {
answer[i] = (int) array[i][0];
}
return answer;
}
}
다른 사람 풀이
import java.util.*;
class Solution {
public int[] solution(int[] weights, String[] head2head) {
int len = weights.length;
int[][] rank = new int[len][4];
for(int i = 0; i < len; i++) {
int w = weights[i], cnt = 0, win = 0, over = 0;
for(int j = 0; j < len; j++) {
char c = head2head[i].charAt(j);
cnt += c == 'N' ? 0 : 1;
win += c == 'W' ? 1 : 0;
over += c == 'W' && weights[i] < weights[j] ? 1 : 0;
}
rank[i][0] = i + 1;
rank[i][1] = (int)((double)win / cnt * 10000000);
rank[i][2] = over;
rank[i][3] = weights[i];
}
Arrays.sort(rank, (a, b) -> {
if(a[1] != b[1]) return b[1] - a[1];
if(a[2] != b[2]) return b[2] - a[2];
if(a[3] != b[3]) return b[3] - a[3];
return a[0] - b[0];
});
int[] answer = new int[len];
for(int i = 0; i < len; i++) answer[i] = (int)rank[i][0];
return answer;
}
}
이 풀이 방법도 내 풀이와 방법은 같은데 좀 더 간결하게 나타낸 코드라서 가져와 보았다. comparator을 정의할 때도 굳이 전부 다 비교하지 않고 하나씩만 비교해서 풀이했다. return으로 나오니까 else도 필요없고 보기 좋게 짠 코드라고 생각된다.
'코딩테스트 > [프로그래머스] 코딩테스트 연습' 카테고리의 다른 글
문자열 압축 (0) | 2021.09.07 |
---|---|
괄호 변환 (0) | 2021.09.07 |
모음 사전 (0) | 2021.09.02 |
퍼즐 조각 채우기 (0) | 2021.08.26 |
직업군 추천하기 (0) | 2021.08.23 |