Algorithm/Programmers
[Lv.3] 야근 지수
시롱시롱
2023. 5. 27. 21:06
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Solution {
public long solution(int n, int[] works) {
long answer = 0;
PriorityQueue<Integer> pq=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
for (int work : works) {
pq.add(work);
}
while(true){
if(n==0){
for (Integer integer : pq) {
answer+=integer*integer;
}
break;
}
Integer target = pq.poll();
if(target<1){
return 0;
}
pq.add(--target);
n--;
}
return answer;
}
}
PriorityQueue를 이용해 쉽게 풀 수 있는 문제였다.
남은 작업량의 제곱의 최소를 만들기 위해선 작업 배열의 최대값을 최소로 만들어야 한다.
즉, 큰 작업부터 먼저 해야한다.
로직은 단순하다.
1. 남은 작업시간이 없다면 (퇴근 시간이 되었다) 남아있는 작업의 제곱의 합을 리턴한다.
2. 남은 작업시간은 있으나 할 작업이 없는 경우 (pq의 Poll값이 1보다 작은경우) 0을 리턴한다.
else-> poll한 작업을 1감소시켜 다시 PQ에 추가하고, 작업을 수행했으니 n도 1감소 시켜준다.
이렇게 반복을 돌게되면 결국 PQ의 특징때문에 제일 큰 값이 게속해서 poll된다.
그러므로, 할 수 있는 만큼 작업을 했을 때 남은 작업들의 제곱의 합을 최소화 할 수 있게 된다.