[프로그래머스] 위클리 챌린지(6주차) - "복서 정렬하기" (Java)
https://programmers.co.kr/learn/courses/30/lessons/85002
난이도 : Level 1
오름차순, 내림차순과 같은 단순한 정렬이 아닌 직접 정렬을 커스텀하여 해결하는 유형의 문제입니다. 몇 가지 예외처리에 조금 애를 먹었지만 높은 난이도를 요구하는 문제는 아닙니다.
저는 아래와 같은 로직으로 문제를 해결하였습니다.
1. 선수의 정보를 저장할 객체를 생성한다.
2. 문제의 조건에 따라 Comparator 인터페이스를 활용하여 정렬을 구현한다.
- class info{ }
선수의 정보를 저장할 객체입니다. 선수의 번호, 무거운 상대방을 이긴 횟수, 몸무게, 승률을 저장합니다.
- int[] solution(int[] weights, String[] head2head)
info 객체 타입의 scores 배열을 생성합니다. setScores, sortScores 함수를 호출하여 scores 배열을 업데이트합니다.
마지막으로 answer 배열에 정렬된 scores배열의 선수 번호를 저장합니다.
- info[] sortScores(info[] scores)
문제에 주어진 조건대로 정렬을 구현합니다. winRate는 double형 변수이므로 두 객체의 계산 값이 음수, 양수에 따라 int 값을 반환하도록 구현하였습니다.
- info[] setScores(info[] scores, int[] weights, String[] head2head)
주어진 정보(입력)를 토대로 scores 배열에 값을 입력합니다.
여기서 주의할 점은 승률을 구하는 부분입니다. 기존에는 total과 win 변수를 int형으로 기존에는 처리하여 계산하였지만 모든 테스트 케이스를 통과할 수 없었습니다. 그래서 아예 승률을 구할 때 필요한 변수는 double형으로 바꿔주어 계산하였습니다.
코드
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public int[] solution(int[] weights, String[] head2head) {
int[] answer = new int[weights.length];
info[] scores = new info[weights.length];
scores = setScores(scores, weights, head2head);
scores = sortScores(scores);
for(int i=0; i<scores.length; i++) {
answer[i] = scores[i].player;
}
return answer;
}
public info[] sortScores(info[] scores) {
Arrays.sort(scores, new Comparator<info>() {
@Override
public int compare(info o1, info o2) {
// 승률이 같으면
if(o1.winRate == o2.winRate) {
// 무거운 복서를 이긴 회수도 같으면
if( o1.weightWin == o2.weightWin) {
// 몸무게도 같으면
if(o1.weight == o2.weight) {
return o1.player - o2.player;
}
return o2.weight - o1.weight;
}
return o2.weightWin - o1.weightWin;
}
// double형 계산을 int형으로 반환
if(o2.winRate - o1.winRate < 0) {
return -1;
}
else if(o2.winRate - o1.winRate > 0) {
return 1;
}
return 0;
}
});
return scores;
}
public info[] setScores(info[] scores, int[] weights, String[] head2head) {
for(int i=0; i<head2head.length; i++) {
double win=0.0; // 이긴 횟수
double total=0.0; // 이기고 진 총 횟수 (N 제외)
double winRate=0.0; // 승률
int weightWin = 0; // 무거운 상대방을 이긴 횟수
int weight = weights[i]; // 자기 몸무게
int player = i+1; // 자기 번호
char status; // N, W, L 상태
for(int j=0; j<head2head[i].length(); j++) {
if(i == j) continue;
status = head2head[i].charAt(j);
if(status == 'W' || status == 'L') total++;
if(status == 'W') {
win++;
if(weight < weights[j]) weightWin++;
}
}
if(total != 0.0) {
winRate = win / total ;
}
scores[i] = new info(player, winRate, weightWin, weight);
}
return scores;
}
}
class info {
int player, weightWin, weight;
double winRate;
public info(int player, double winRate, int weightWin, int weight) {
this.player = player;
this.winRate = winRate;
this.weightWin = weightWin;
this.weight = weight;
}
}
피드백 환영합니다.
'문제 풀이 > Java' 카테고리의 다른 글
[백준] 11404번 - "플로이드" (Java) (0) | 2021.09.19 |
---|---|
[프로그래머스] 위클리 챌린지(7주차) - "입실 퇴실" (Java) (0) | 2021.09.18 |
[프로그래머스] 위클리 챌린지(5주차) - "모음 사전" (Java) (0) | 2021.09.15 |
[프로그래머스] 위클리 챌린지(4주차) - "직업군 추천하기" (Java) (0) | 2021.09.13 |
[프로그래머스] 2020 KAKAO BLIND RECRUITMENT - "자물쇠와 열쇠" (Java) (0) | 2021.09.10 |
댓글
이 글 공유하기
다른 글
-
[백준] 11404번 - "플로이드" (Java)
[백준] 11404번 - "플로이드" (Java)
2021.09.19 -
[프로그래머스] 위클리 챌린지(7주차) - "입실 퇴실" (Java)
[프로그래머스] 위클리 챌린지(7주차) - "입실 퇴실" (Java)
2021.09.18 -
[프로그래머스] 위클리 챌린지(5주차) - "모음 사전" (Java)
[프로그래머스] 위클리 챌린지(5주차) - "모음 사전" (Java)
2021.09.15 -
[프로그래머스] 위클리 챌린지(4주차) - "직업군 추천하기" (Java)
[프로그래머스] 위클리 챌린지(4주차) - "직업군 추천하기" (Java)
2021.09.13