자료구조&알고리즘/프로그래머스

프로그래머스 - 명예의 전당(1) [JAVA]

yong_ღ'ᴗ'ღ 2023. 11. 13. 16:40

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;
    }
}