문제: https://school.programmers.co.kr/learn/courses/30/lessons/12927
매번 정렬을 진행하고 가장 큰수에서 1을 빼주기
import java.util.*;
class Solution {
public long solution(int n, int[] works) {
Arrays.sort(works);
long answer = 0;
while(n > 0){
if(works[works.length-1] == 0) break;
works[works.length-1] -= 1;
n -= 1;
Arrays.sort(works);
}
for(int i : works){
answer += i * i;
}
return answer;
}
}
⇒ 효율성 테스트에서 탈락
→ 매번 정렬을 하는 부분에서 시간을 많이 잡아먹게 된다.
→ PriorityQueue로 가장 큰 수만 뽑을 수 있다면?
import java.util.*;
class Solution {
public long solution(int n, int[] works) {
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
long answer = 0;
// 1. pq에 원소 넣기
for(int i : works){
pq.offer(i);
}
// 2. n만큼 가장 큰 값을 빼주기
while(n > 0 && pq.size() != 0){
int num = pq.poll();
if(num == 0) break;
num -= 1;
n -= 1;
pq.offer(num);
}
// 3. 하나씩 뽑으면서 answer에 더하기
while(pq.size() != 0){
int num = pq.poll();
answer += num * num;
}
return answer;
}
}
가장 처음 생각은 인접한 두 수를 계속 비교해가며 n을 소진시키는 것이었는데, 생각해보니 오류가 나는 부분이 많았다.
인접한 두 수의 차이가 커 n을 모두 소진시켰더니 그 다음수가 많이 큰 수라면 에러가 난다 → 큰 수를 모두 1씩 빼주는게 제곱의 합을 줄이는 방법이기 때문이다.
여러번 고민끝에 푼 문제라 뿌듯했다!
참 어렵주잉~?