728x90
문제 설명
1. 복서의 몸무게, 전적이 주어진다.
2. W(이김), L(짐), N(경기안함) 이고, 경기를 안하면 체크하지 않는다.
3. 승률 - 자기보다 무거운사람을 이긴 횟수 - 자기 몸무게 의 순서로 동률이면 뒤의 것을 고려하여 rank를 return하면 된다.
풀이 과정
1. 이것도 정렬을 사용하면 매우 간단한 문제이다...사실 시간복잡도에서 걸릴 것 같았는데 어째 통과가 되었다.
2. 전체경기수, 이긴수를 구하서 승률 / 자기보다 무거운 사람 이긴 수 / 자기 몸무게를 배열에 저장한다.
3. compare의 로직을 이용하여 간단하게 순서대로 정렬하면 구해진다.
4. 노드별 compare구현하기~
코드
import java.util.*;
class Solution {
public int[] solution(int[] weights, String[] head2head) {
int leng = weights.length;
int[] answer = new int[leng];
double rank[][] = new double[leng][4]; // 0:승률 1:자기보다무거운사람이긴횟수 2:자기몸무게 3:본인위치-1
for(int i=0; i<leng; i++){
int cnt = leng; // 전체 게임 횟수이다.
int wins = 0; // 이긴 횟수이다.
rank[i][2] = weights[i]; // 본인 몸무게 기입
rank[i][3] = i; // 본인 순서-1(배열은 0부터시작이니까)
for(int j=0; j<leng; j++){
if(i==j || head2head[i].charAt(j) == 'N') cnt--; // 게임을 안하면 게임횟수 하나 뺌.
else if(head2head[i].charAt(j) == 'W'){ // 이겼으면
if(weights[i] < weights[j]) rank[i][1]++; // 니보다 무거운경우 1번 node의 수를 늘려줌
wins++; // 이길때마다 wins++
}
}
if(cnt!=0)rank[i][0] = (double)wins/cnt; // 승률은 이긴횟수/전체게임 참고로 한판도 안했으면 배열은 0으로 초기화되므로 냅두면 된다.
}
Arrays.sort(rank, (o1, o2) -> { // 승률, 자기보다 무거운사람 이긴 횟수, 자기 몸무게 순서대로 다중 정렬한다.
if(o1[0] == o2[0]){ // 승률이 같은경우
if(o1[1] == o2[1]) // 자기보다 무거운사람 이긴 횟수가 같은 경우
return Double.compare(o2[2], o1[2]); // 몸무게대로 정렬
else
return Double.compare(o2[1], o1[1]); // 자기보다 무거운 사람 이긴 횟수로 정렬
}else{
return Double.compare(o2[0], o1[0]); // 몸무게별 정렬
}
});
for(int i=0; i<leng; i++){
answer[i] = 1 + (int)rank[i][3]; // 그래서 그 위치를 구해주면 됨.
}
return answer;
}
}
'알고리즘 공부 > 위클리 챌린지' 카테고리의 다른 글
프로그래머스 위클리 챌린지 8주차 - java (0) | 2021.09.27 |
---|---|
프로그래머스 위클리 챌린지 7주차 - java (0) | 2021.09.14 |
프로그래머스 위클리 챌린지 5주차 - java (4) | 2021.08.30 |
프로그래머스 위클리 챌린지 4주차 - java (0) | 2021.08.23 |
프로그래머스 위클리 챌린지 3주차 - java (0) | 2021.08.22 |