프로그래머스 - 명예의 전당(1) [JAVA]
https://school.programmers.co.kr/learn/courses/30/lessons/138477
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제)
매일 1명의 가수가 추가되며, 그 가수에게 점수가 부여된다.
그 추가되는 가수가 지금까지 출연 가수들의 점수 중 상위 k번째 이내이면, 명예의 전당에 올라간다.
매일 1명씩 추가되는 것이므로 → 처음부터 k일까지는 모든 출연 가수의 점수가 명예의 전당에 오르고,
k일 다음부터는 추가되는 가수가 기존 명예의 전당에 있는 가수보다 점수 높으면, 현재 가수가 명예의 전당에 올라가고, 그로 인해 k번째 이후 순위가 된 가수는 명예의 전당에서 내려가게 된다.
이 때 1일부터 마지막날까지 명예의 전당 최하위 점수를 배열에 담아 return해라.
접근 방식)
1. score개수만큼 result 값이 생길 것이므로, score.length 길이의 정답배열 생성
명예의전당 목록 k개 중 점수가 제일 낮은 거와 오늘 추가되는 점수를 비교하기 위해, PriorityQueue pq 생성
2. score개수만큼 반복문 돌면서,
1) pq에 점수 넣는다.
2) 만약 pq의 size가 k보다 커지면 제일 낮은 점수를 제거한다. (→ pq.poll())
3) 정답배열에 현재 명예의 전당 목록 중 제일 낮은 점수를 추가한다. (→ pq.peek())
import java.util.*;
class Solution {
public int[] solution(int k, int[] score) {
int[] answer = new int[score.length];
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int i = 0; i < score.length; i++) {
pq.add(score[i]);
if (pq.size() > k)
pq.poll();
answer[i] = pq.peek();
}
return answer;
}
}