🤬[プログラマー]残業指数


この投稿は、LongroadhomeのプログラマーLV。3残業指数JSの投稿を参考に作成されました.

問題の説明


会社員のデミはたまに残業しますが、残業すると残業疲労度が溜まります.残業疲労度は、残業開始時の残量に1つの数値を乗じたものです.デミはN時間以内に残業疲労度を最小限に抑える.デミが1時間以内に1時間の仕事量を処理できると言った場合、退勤前の残りのN時間と各仕事の仕事量について、残業疲労度を最低値に下げる関数解を返してください.

せいげんじょうけん

works는 길이 1 이상, 20,000 이하인 배열입니다.

works의 원소는 50000 이하인 자연수입니다.

n은 1,000,000 이하인 자연수입니다.

I/O例



I/O例説明


I/O例#1
n=4の場合、残りの仕事量が[4,3]の場合、残業指数を最小化するために4時間働いた結果は[2,2,2]であった.このとき残業指数は22+22+22=22です.
I/O例#2
n=1の場合、残りの仕事量が[2,1,2]であれば、残業指数を最小化するために1時間働いた結果は[1,1,2]である.残業指数は12+12+22=6です.

私の答え

function solution(n, works) {
    // 할 수 있는 일의 총량이 works 배열을 모두 비울 수 있는 경우
    if(works.reduce((a,b) => a+b,0) <= n) return 0
    
    // 오름차순 정렬
    works.sort((a,b) => b-a)
    
    // 아직 할 수 있는 일이 남은경우
    while(n) {
        // 0번째 인덱스가 해당 반복의 최댓값
        const max = works[0]
        for(let i = 0 ; i < works.length ; i ++) {
            // 해당 인덱스도 최댓값과 같다면
            if(works[i] === max) {
                n--
                works[i]--
            }
            if(!n) break
        }    
    }
    
    return works.reduce((a,b) => a+(b**2) ,0)
}

  • 演算を必要としないことの合計よりもできることが多ければ[0,0,...]0を返します

  • 昇順ソート

  • n残り時間繰り返し
    3-1. 最値を指定し、最値と同じ配列の最大数を検索し、完了できる日数と対応するインデックスの数をそれぞれ1つ押します.
    ※大数の平方は常に小数の平方より大きいので、大数を全て探して平均化する過程
    3-2. タスクに0個のタスクがある場合は、繰り返しを停止します.

  • すべての剰余二乗を加算して出力