그리디
먼저 주어진 배열을 오름차순으로 정렬해둡니다.
n이 0이 될 때까지 반복합니다.
배열에 가장 마지막 원소가 최댓값이므로 최댓값을 따로 설정해두고, 배열에 끝에서부터 앞까지 반복하는데, 원소가 최댓값과 같거나 크다면 -1을 해주고, n도 -1 합니다.
n이 0 이하라면 종료합니다.
배열의 원소가 전부 0 이하라면 0을 반환하고, 아니라면 각 원소를 제곱한 후에 모두 더해서 반환합니다.
function solution(n, works) {
works.sort((a, b) => a - b);
while (n) {
const max_value = works.at(-1);
for (let i = works.length - 1; i >= 0; i--) {
if (works[i] >= max_value) {
if (n <= 0) break;
works[i]--;
n--;
}
}
}
return works.every((v) => v <= 0) ? 0 : works.map((v) => v ** 2).reduce((a, c) => a + c);
}