처음 풀이
function solution(n, works) {
let answer = 0;
for (let i = 0; i < n; i++) {
// works 배열에서 최대값의 인덱스를 찾음
let maxIdx = works.indexOf(Math.max(...works));
// 최대값의 원소를 1 감소시킴
works[maxIdx] = works[maxIdx] - 1;
// 만약 최대값이 0이 되면 배열에서 제거
if (works[maxIdx] === 0) {
works.splice(maxIdx, 1);
}
}
// 남은 작업량을 제곱하여 answer에 더함
works.forEach(el => {
answer += el * el;
});
return answer;
}
틀리진 안았지만, 효율성 테스트를 통과하지 못했다.
function solution(n, works) {
let answer = 0;
// 남은 작업량의 합이 n 이하이면 추가 작업 필요 없음
if (works.reduce((a, b) => a + b) <= n) return 0;
// 작업량을 내림차순으로 정렬
works.sort((a, b) => b - a);
// 남은 작업량이 있을 때까지 반복
while (n) {
// 현재 최대 작업량
let max_num = works[0];
// 처음 원소부터 뒤로 가며
// 현재 최대값 이상인 값이 있다면 제거해준다.
// 따라서 현재 최대값은 계속 처음 위치에 있을 수 있다.
for (let i = 0; i < works.length; i++) {
if (works[i] >= max_num) {
works[i] -= 1;
n -= 1;
}
// 남은 작업량이 0이면 반복 중단
if (!n) break;
}
}
// 남은 작업의 제곱 합 구하기
works.forEach((el) => {
answer += el * el;
});
return answer;
}