💡Problem Solving/Programmers

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

gom20 2021. 10. 29. 15:52

문제

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

 

코딩테스트 연습 - 야근 지수

회사원 Demi는 가끔은 야근을 하는데요, 야근을 하면 야근 피로도가 쌓입니다. 야근 피로도는 야근을 시작한 시점에서 남은 일의 작업량을 제곱하여 더한 값입니다. Demi는 N시간 동안 야근 피로도

programmers.co.kr

 

풀이

Level3 이지만 체감 난이도는 Level1 느낌이다. 

1. 모든 work를 최대힙에 담는다.

2. 야근 시간만큼 순회하면서 최대값을 가지는 원소를 poll하여 -1 한후 다시 offer하였다. 

3. 이후 queue에 남은 원소를 제곱하여 합계를 내었다.

 

소스코드

import java.util.*;
import java.lang.*;

class Solution {
    public long solution(int n, int[] works) {
        PriorityQueue<Integer> que = new PriorityQueue<Integer>(new Comparator<Integer>(){
            @Override
            public int compare(Integer l1, Integer l2){
                if(l1 - l2 > 0) return -1;
                else if(l1 - l2 < 0) return 1;
                else return 0;
            }
        });
        
        for(int i = 0; i < works.length; i++){
            que.offer(works[i]);
        }
        
        long answer = 0;
        for(int i = 0; i < n; i++){
            if(que.isEmpty()) break;
            int work = que.poll();
            if(work-1 > 0) que.offer(work-1);
        }
        
        while(!que.isEmpty()){
            answer += Math.pow(que.poll(), 2);
        }
        
        return answer;
    }
}