프로그래머스 위클리 챌린지 6주차 (자바)
🍀 문제
복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요.
- 전체 승률이 높은 복서의 번호가 앞쪽으로 갑니다. 아직 다른 복서랑 붙어본 적이 없는 복서의 승률은 0%로 취급합니다.
- 승률이 동일한 복서의 번호들 중에서는 자신보다 몸무게가 무거운 복서를 이긴 횟수가 많은 복서의 번호가 앞쪽으로 갑니다.
- 자신보다 무거운 복서를 이긴 횟수까지 동일한 복서의 번호들 중에서는 자기 몸무게가 무거운 복서의 번호가 앞쪽으로 갑니다.
- 자기 몸무게까지 동일한 복서의 번호들 중에서는 작은 번호가 앞쪽으로 갑니다.
입출력 예
[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] |
코딩테스트 연습 - 6주차 | 프로그래머스 (programmers.co.kr)
코딩테스트 연습 - 6주차
복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요
programmers.co.kr
😊 나의 코드
import java.util.*;
class Solution {
public int[] solution(int[] weights, String[] head2head) {
int length = weights.length;
List<Player> list = new ArrayList<Player>();
for (int i = 0; i < length; i++) {
Player player = new Player();
player.setNum(i + 1);
player.setWeight(weights[i]);
int win = 0;
int lose = 0;
int overWin = 0;
for (int j = 0; j < length; j++) {
if (head2head[i].charAt(j) == 'W') {
win++;
if (weights[i] < weights[j]) {
overWin++;
}
} else if (head2head[i].charAt(j) == 'L') {
lose++;
}
}
if ((win + lose) == 0) {
player.setRate(0);
} else {
player.setRate((double) win / (win + lose));
}
player.setWinCnt(overWin);
list.add(player);
}
Collections.sort(list, new Comparator<Player>() {
public int compare(Player o1, Player o2) {
if (o1.getRate() > o2.getRate()) {
return -1;
} else if (o1.getRate() < o2.getRate()) {
return 1;
} else if (o1.getWinCnt() > o2.getWinCnt()) {
return -1;
} else if (o1.getWinCnt() < o2.getWinCnt()) {
return 1;
} else if (o1.getWeight() > o2.getWeight()) {
return -1;
} else if (o1.getWeight() < o2.getWeight()) {
return 1;
} else if (o1.getNum() > o2.getNum()){
return 1;
}else {
return -1;
}
}
});
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i).getNum();
}
return answer;
}
}
class Player {
private int num;// 선수 번호
private double rate;// 승률
private int winCnt;// 자기보다 무거운 복서를 이긴 횟수
private int weight;// 몸무게
public void setNum(int num) {
this.num = num;
}
public void setRate(double rate) {
this.rate = rate;
}
public void setWinCnt(int winCnt) {
this.winCnt = winCnt;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getNum() {
return num;
}
public double getRate() {
return rate;
}
public int getWinCnt() {
return winCnt;
}
public int getWeight() {
return weight;
}
}
ㅎㅎㅎ길다...ㅎㅎㅎ
비교할 조건(승률,무거운 복서를 이긴 횟수,몸무게,번호)이 여러 개여서
객체를 만들어서 정렬하는 방법을 써야겠다고 생각했다.
그래서 Player 객체에 비교 조건 데이터들을 저장할 수 있도록 만들었다.
각 선수들의 정보를 player 객체에 저장하고
이 player 객체들을 list에 저장한 후 Comparator을 사용해서 정렬하였다.
Comparator 정렬로 compare 메소드를 사용하면 커스텀하여 정렬하기 좋다.
compare(객체1, 객체2) 일때 return형이 양수이면 객체1과 객체2의 순서를 바꿔주고, 음수이면 순서를 바꾸지 않는다.
참고 👇
https://cchoimin.tistory.com/entry/%EA%B0%9D%EC%B2%B4-%EC%A0%95%EB%A0%AC-Comparator
[JAVA] 객체 정렬 Comparator
* Comparator => 기본정렬기준 외에 다른 여러 기준으로 정렬하고자 할때 사용하는 클래스 단순 리스트를 정렬할때 보통 Collections.sort()를 사용한다 //오름차순 ArrayList list = new ArrayList (); list.add(..
cchoimin.tistory.com
근데 다른 사람들의 코드를 보니 굳이 객체를 만들지 않고 배열로도 여러 조건을 정렬할 수 있었다.
참고 👇
[Java] 2차원 배열 정렬 방법 Arrays.Sort(arr, Comparator)
1차원 배열 정렬 방법 오름차순으로 정렬이 된다. import java.util.Arrays; Arrays.sort(arr); 2차원 배열 정렬 방법 2차원 배열을 정렬하기 위해서는 Comparator를 Override하여 정렬 기준을 제시하면 된다. 예..
gre-eny.tistory.com