728x90
https://programmers.co.kr/learn/courses/30/lessons/85002
문제 풀이
import java.util.*;
public class Solution {
class Player implements Comparable<Player> {
int n, w, h; double r; // n : num, w : weight, h : win_cnt_heavier, r : win_rate
Player(int n, int w, double r, int h) {
this.n = n;
this.w = w;
this.r = r;
this.h = h;
}
@Override
public int compareTo(Player o) {
return this.r == o.r ? this.h == o.h ? this.w == o.w ?
Integer.compare(this.n, o.n) : Integer.compare(o.w, this.w) :
Integer.compare(o.h, this.h) : Double.compare(o.r, this.r);
}
}
public int[] solution(int[] weights, String[] head2head) {
int n = weights.length, i, j, w, cm, cw, cwh; String rs; char r;
// w : weight, cm : cnt of matches, cw : cnt of matches won, cwh : cnt of matches won heavier
// r : result of matches of one player
PriorityQueue<Player> pq = new PriorityQueue<>();
for (i = 0; i < n; ++i) {
w = weights[i];
rs = head2head[i];
cm = cw = cwh = 0;
for (j = 0; j < n; ++j) {
r = rs.charAt(j);
if (r == 'N')
continue;
cm++;
if (r == 'W') {
cw++;
if (w < weights[j])
cwh++;
}
}
pq.add(new Player(i + 1, w, cm == 0 ? 0 : cw / (double)cm * 100, cwh));
}
int ans[] = new int[n];
i = 0;
while (!pq.isEmpty())
ans[i++] = pq.remove().n;
return ans;
}
}
- 한 선수의 정보
- 번호 ( n : num )
= i + 1 - 무게 ( w : weight )
= weights[i] - 전체 승률 ( r : win_rate )
= ( head2head[i].charAt(j) 가 'W' 인 횟수 ) / ( double )( head2head[i].charAt(j) 가 'N' 이 아닌 횟수 ) * 100
= ( cw : cnt of matches won ) / ( double )( cm : cnt of matches ) * 100 - 자신보다 몸무게가 무거운 복서를 이긴 횟수 ( h : win_cnt_heavier )
= head2head[i].charAt(j) 가 'W' 이며, weights[i] < weights[j] 인 횟수 ( cwh : cnt of matches won (heavier) )
- 한 선수에 대한 Class인 Player 생성
- Player Class에 Comparable Interface를 구현하여 비교 기준 설정 ( https://hyunjiishailey.tistory.com/432?category=381224 )
- 전체 승률 (내림차순)
- 자신보다 몸무게가 무거운 복서를 이긴 횟수 (내림차순)
- 무게 (내림차순)
- 번호 (오름차순)
- 우선순의 큐( PriorityQueue<Player> ) 생성
- 전달받은 int weights[] 와 String head2head[] 를 순차적으로 탐색하며 Player 객체 생성하고 우선순위 큐에 넣음
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 프로그래머스 ( Programmers )' 카테고리의 다른 글
[프로그래머스(Programmers)][자바(java)] (Lv1) 없는 숫자 더하기 <월간코드챌린지3> (0) | 2021.09.18 |
---|---|
[프로그래머스(Programmers)][자바(java)] (Lv2) 7주차 - 입실 퇴실 <위클리 챌린지> (0) | 2021.09.18 |
[프로그래머스(Programmers)][자바(java)] (Lv2) 5주차 - 모음 사전 <위클리 챌린지> (0) | 2021.09.01 |
[프로그래머스(Programmers)][자바(java)] (Lv1) 4주차 - 직업군 추천하기 <위클리 챌린지> (0) | 2021.08.26 |
[프로그래머스(Programmers)][자바(java)] (Lv3) 3주차 - 퍼즐 조각 채우기 <위클리 챌린지> (0) | 2021.08.26 |