https://programmers.co.kr/learn/courses/30/lessons/12927
// 야근피로도 : 야근을 시작한 시점에서 남은일의 작업량을 제곱하여 더한값
function solution(n, works) {
let sorted = works.sort((a,b)=>{return b-a});
// console.log(sorted);
let idx = 0;
while(n>0){
if(sorted[idx] < sorted[idx+1]){
console.log('e');
idx++;
}
if(sorted[idx-1]== sorted[idx]){
console.log('d');
idx=0;
}
sorted[idx]--;
n--;
// console.log(idx, n, sorted);
}
// console.log(sorted);
sorted = sorted.map(el=>{
return el<0 ? el = 0 : el;
})
// console.log(sorted);
let pow = sorted.map(el=>Math.pow(el, 2));
let answer = pow.reduce((a, cur)=>{return a + cur},0)
return answer;
}
let n =99;
let works = [2, 15, 22, 55, 55];
console.log(solution(n, works));
야근 피로도를 구하는 문제다.
야근 피로도는 야근을 시작한 시점에서 남은 일의 작업량을 제곱하여 더한 값이다.
N시간동안 야근 피로도를 최소화 시키려한다.
works n result
[4, 3, 3] 4 = 12
[2, 1, 2] 1 = 6
[1, 1] 3 = 0
처음에 가장 최소가 되는 경우가 어떤 경우인지 부터 생각했다.
큰 수로 정렬을 하고, 하나씩 빼면 되는 건가?라는 생각이 들어 처음엔 그렇게 구현했다.
[4,3,3] 경우
[3,3,3] 3
[3,2,3] 2
[3,2,2] 1
[2,2,2] 0
그러나 오답이였다.
아래 에제를 위의 경우와 같이 생각해보자.
n=3
[1, 5, 10] 3
[9, 5, 1] 2
[9, 4, 1] 1
[9, 4, 0] 0
81 + 16 = 97
답은 97이 나오지만, 정답은 75다.
[9,5,1] 2
[8,5,1] 1
[7,5,1] 0
49 + 25 + 1 = 75
가장 작은 경우는 언제 일까?
이 부분은 언젠지 마땅히 떠오르지 않아 다른사람의 글을 보고 알았다.
정답은 큰 수로 정렬하고나서 큰 수 부터 하나씩 빼고, 다음 수가 현재 수보다 크다면 idx를 증가 시켜 그다음 수를 뺀다.
그러다 보면 다음 수가 현재 수보다 크지 않은데, 이 경우 가장 큰수는 배열의 첫번째 수다.
그래서 idx를 0으로 되돌리고, 다시 다음값과 비교하며 idx를 증가시켜나간다.
n이 0될때 까지 반복하고, 남은 배열에 음수가있으면 0으로 바꿔준다. 그 후 제곱한 배열 pow를 만들고, 해당 요소들을 reduce를 이용해 더해주어 답을 도출해냈다.
https://velog.io/@longroadhome/프로그래머스-LV.3-야근-지수-JS
https://woomin.netlify.app/TDD/2020/08/2020-08-17-tdd/