[프로그래머스] 실패율(java)

박현우·2020년 9월 26일
0

프로그래머스

목록 보기
14/34

문제

실패율

문제 풀이

각 스테이지당 실패율을 계산한 후, 스테이지와 실패율을 담은 Class를 정의하여 우선순위 큐에 담는다. 그 후, Comparator를 이용하여 실패율을 기준으로 내림차순 정리하면 된다. 그다지 어렵진 않지만,

  • 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
  • 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.

이런 제한 사항이 붙어있기 때문에 약간의 핸들링이 필요하다. 나는 스테이지와 실패율을 담은 클래스에 compareTo 메소드를 오버라이드했다.

프로그램 코드

import java.util.*;
class Solution {
    public int[] solution(int N, int[] stages) {
        
        PriorityQueue<Node> pq = new PriorityQueue();
		int[] progress = new int[N + 2]; // stages 는 1이상 N+1이하
		int trys = stages.length;

		for (int i = 0; i < stages.length; i++) {
			progress[stages[i]]++;
		}
		for (int i = 1; i <= N; i++) {
			double fail=0;
			if (trys == 0) {
				fail = 0;
			} else {
				fail = (double) progress[i] / (double) trys;
			}
			trys -= progress[i];
			Node n = new Node(i, fail);
			pq.offer(n);
		}
		int[] answer = new int[pq.size()];
		int size = pq.size();
		for (int i = 0; i < size; i++) {
			answer[i] = pq.poll().stage;
		}
        return answer;
    }
    static class Node implements Comparable<Node> {
		int stage;
		double fail;

		Node(int stage, double fail) {
			this.stage = stage;
			this.fail = fail;
		}

		@Override
		public int compareTo(Node n) {
			if (this.fail == n.fail) { // 실패율이 같다면 stage 낮은게 먼저
				if (this.stage < n.stage) {
					return -1;
				} else {
					return 1;
				}
			} else
				return this.fail < n.fail ? 1 : -1;
		}
	}
}

0개의 댓글