[프로그래머스(Programmers)][자바(java)] (Lv1) 6주차 - 복서 정렬하기 <위클리 챌린지>

728x90

 

https://programmers.co.kr/learn/courses/30/lessons/85002

 

코딩테스트 연습 - 6주차

복서 선수들의 몸무게 weights와, 복서 선수들의 전적을 나타내는 head2head가 매개변수로 주어집니다. 복서 선수들의 번호를 다음과 같은 순서로 정렬한 후 return 하도록 solution 함수를 완성해주세요

programmers.co.kr

 

문제 풀이

 

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) )
    1.  전체 승률 (내림차순)
    2.  자신보다 몸무게가 무거운 복서를 이긴 횟수 (내림차순)
    3.  무게 (내림차순)
    4.  번호 (오름차순)
  • 우선순의 큐( PriorityQueue<Player> ) 생성
  • 전달받은 int weights[] 와 String head2head[] 를 순차적으로 탐색하며 Player 객체 생성하고 우선순위 큐에 넣음

 

 

반응형