728x90
반응형
https://github.com/ROUTINE-STUDY/Algorithm
알고리즘 스터디를 진행하고 있습니다. 😊
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
참여 문의는 댓글 혹은 GitHub 주소를 참고해주세요.
문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/85002
문제 설명
요구사항에 맞게 정렬하여 반환하세요.
풀이 방법
정렬을 하기 위한 지표가 정해져 있습니다.
[승률, 체급 차 극복 승리 횟수, 몸무게, 번호] - 번호를 제외한 나머지 모두 내림차순입니다.
1. 위 지표를 가지고 있는 Player라는 class를 작성합니다.
2. 지표를 구한 뒤 해당 각 Player를 List에 담아줍니다.
3. Collections.sort()와 Comparator를 이용하여 요구사항에 맞도록 정렬해줍니다.
4. 정렬된 List로 return 배열을 만들어 반환합니다.
내 코드(JAVA)
// 1. 지표를 가지고있는 Player class 작성
class Player {
int no;
int weight;
double winRate;
int overCount;
public Player(int no, int weight, double winRate, int overCount) {
this.no = no;
this.weight = weight;
this.winRate = winRate;
this.overCount = overCount;
}
}
public class Sanghoo {
public int[] solution(int[] weights, String[] head2head) {
int[] answer = new int[weights.length];
List<Player> records = new ArrayList<>();
// 2. 각종 지표 구하기(승률, 체급차 승리 횟수) + Player를 List에 담기
for(int i=0; i<head2head.length; i++) {
double winCount = 0.0;
double totalCount = 0.0;
int overCount = 0;
char[] recordArray = head2head[i].toCharArray();
for(int j=0; j<recordArray.length; j++) {
if(recordArray[j] != 'N') {
totalCount++; // 경기 수
if(recordArray[j] == 'W') {
winCount++; // 승리 수
if(weights[i] < weights[j]) overCount++; // 체급 차 승리 수
}
}
}
double winRate = winCount/totalCount; // 승률
Player player = new Player(i+1, weights[i], winRate, overCount);
records.add(player);
}
// 3. 요구사항대로 정렬하기
Collections.sort(records, new Comparator<Player>() {
@Override
public int compare(Player p1, Player p2) {
// 승률 내림차순
if(p1.winRate > p2.winRate) return -1;
else if(p1.winRate < p2.winRate) return 1;
else { // 승률 같다면, 체급 차 승리 수 내림차순
if(p1.overCount > p2.overCount) return -1;
else if(p1.overCount < p2.overCount) return 1;
else { // 같다면, 몸무게 내림차순
if(p1.weight > p2.weight) return -1;
else if(p1.weight < p2.weight) return 1;
else { // 같다면, 번호(이름) 오름차순
if(p1.no > p2.no) return 1;
else if(p1.no < p2.no) return -1;
}
}
}
return 0;
}
});
// 4. return 배열 만들기(player의 번호)
for(int i=0; i<records.size(); i++) {
Player player = records.get(i);
answer[i] = player.no;
}
return answer;
}
}
3번의 요구사항대로 정렬하는 코드를 줄일 수 있는 리팩토링이 가능할 것 같다.
728x90
반응형
'알고리즘' 카테고리의 다른 글
[프로그래머스/JAVA] 최소직사각형(8주차) (0) | 2021.10.03 |
---|---|
[LeetCode/JAVA] 1200. Minimum Absolute Difference (0) | 2021.09.14 |
[프로그래머스/JAVA] 상호 평가 (0) | 2021.09.11 |
[프로그래머스/JAVA] 부족한 금액 계산하기 (0) | 2021.09.08 |
[LeetCode/JAVA] 1684. Count the Number of Consistent Strings (0) | 2021.09.04 |
댓글