PS/프로그래머스

[프로그래머스] 야근지수 (JAVA/자바)

nyrimmm 2026. 2. 3. 15:26

[문제 링크]

https://school.programmers.co.kr/learn/courses/30/lessons/12927

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

야근피로도 = (N시간 동안 야근 후 남은 일의 각 작업량^2) 을 모두 더한 값

N시간동안 works 배열에 담긴 각 일의 작업량을 적절하게 처리했을 때, 야근 피로도의 최소값을 구한다.

1시간동안 작업량 1을 처리할 수 있다.

 

 

 

문제 풀이

알고리즘 분류

  • 우선순위 큐(PriorityQueue)

야근 피로도의 최소값을 구하려면 작업량이 가장 많은 일부터 처리해서 제곱근의 크기를 작게 한다.

 

PriorityQueue에 현재 남은 작업량을 담고, ollections.reverseOrder()로 내림차순 정렬한다.

n번만큼 반복하면서 작업량이 가장 많은 일부터 -1 한다.

작업량이 0인 경우에는 큐에 다시 넣지 않는다.

 

전체코드

import java.util.*;

class Solution {
    public long solution(int n, int[] works) {
        long answer = 0;

        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
        
        for(int w : works) {
            pq.add(w);
        }
        
        while(n > 0 && !pq.isEmpty()) {
            int poll = pq.poll();
            if((poll - 1) > 0) {
                pq.add(poll - 1);
            }
            n--;
        }
        
        while(!pq.isEmpty()) {
            int work = pq.poll();
            answer += work * work;
        }
        return answer;
    }
}