[JavaScript][Programmers] 야근 지수

조준형·2021년 9월 9일
0

Algorithm

목록 보기
133/142
post-thumbnail

🔎 야근 지수

❓ 문제링크

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/

profile
깃허브 : github.com/JuneHyung

0개의 댓글