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
'자바 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 리코쳇 로봇 - Java(자바) (0) | 2024.05.30 |
---|---|
[프로그래머스] 행렬 테두리 회전하기 - Java(자바) (0) | 2024.05.27 |
[프로그래머스] 두 큐 합 같게 만들기 - Java(자바) (0) | 2024.05.22 |
[프로그래머스] 거리두기 확인하기 - Java(자바) (0) | 2024.05.21 |
[프로그래머스] 괄호 변환 -Java(자바) (0) | 2024.05.13 |