자바/코딩테스트

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

대전집주인 2024. 5. 28. 15:51
728x90
SMALL

 

문제 이해

  • N 시간 동안 야근을 해야한다.
  • 작업량 works 배열만큼 남아있는데 이 작업량은 1시간에 1만큼 줄어들며 N시간이 다 지난후 작업량들의 제곱 합이 야근의 피로도이다.
  • 피로도를 최소화하고자 한다.
  • 문제를 보면 작업량들의 제곱 합이 최소값이 되도록 해야한다. 그렇다는건 작업량들의 수치들이 모두 비슷한 값이면 제곱 합이 되면 최소값이 될 수 있다는 뜻이다.
  • N시간 보다 남은 작업량이 작다면 피로도는 0으로 return 해준다.
  • 작업량을 모두 근사치로 만들기 위해 작업량의 최대값을 뽑아 -1 씩 빼는걸 N시간 만큼 반복할 것이다.
  • 반복과 정렬이 모두 가능하도록 우선순위 큐 PriorityQueue 를 사용하고자 한다.
  • 큐의 최대값을 뽑은 값을 -1을 하여 다시 집어 넣는 방식을 N 이 0이 될때까지 반복한다.
  • 큐의 원소값들을 제곱하여 모두 더한다.
import java.util.*;
class Solution {
    public long solution(int n, int[] works) {
        long answer = 0;
        int sumArr = 0;
        PriorityQueue<Integer> que = new PriorityQueue<>(Collections.reverseOrder());
        
        for(int i : works) {
            sumArr += i;
            que.offer(i);
        }
        
        // N시간 보다 작업량이 적으면 나가기
        if(sumArr <= n) return 0;
        
        // 큐의 최대값 빼고 -1 하여 큐에 다시 집어 넣기
        while(n > 0){
            Integer num = que.poll();
            que.offer(num - 1);
            n--;
        }
        
        while(!que.isEmpty()){
            answer += Math.pow(que.poll(),2);
        }
    
        return answer;
    }
}
728x90
LIST