[プログラマー]予算😄


[プログラマー]予算
https://programmers.co.kr/learn/courses/30/lessons/12982
最初のコード
function solution(d, budget) {
    var answer = [];
    var sum = 0;
    let arr = d.sort((a,b) => a-b);
    for(let i = 0; i < arr.length; i++){
        sum += arr[i];
        answer.push(arr[i]);
        if(sum + arr[i+1] > budget)
            break;
    }
    return answer.length;
}
テスト3番が間違っています.
どのテストケースに適していないか考えてみましょう.
各部門が申請した金額が予算より高い場合、テストが3回間違っていることがわかります.
function solution(d, budget) {
    var answer = [];
    var sum = 0;
    let arr = d.sort((a,b) => a-b);
    for(let i = 0; i < arr.length; i++){
        if(arr[i] < budget){
            sum += arr[i];
            answer.push(arr[i]);
        }
        if(sum + arr[i+1] > budget)
            break;
    }
    return answer.length;
}
しかし、予算が申請金額を下回った場合、例外処理をしました.
テスト1、4でエラーが発生しました.
完璧ではないコード.
最終コード
function solution(d, budget) {
    var answer = [];
    var sum = 0;
    let arr = d.sort((a,b) => a-b);
    for(let i = 0; i < arr.length; i++){
        if(arr[i] <= budget){ // 작거나 같다 처리를 해야했다.
            sum += arr[i];
            answer.push(arr[i]);
        }
        if(sum + arr[i+1] > budget)
            break;
    }
    return answer.length;
}
追加されたテストケース

3つ目は、申請金額より予算が小さいテストケース(テスト3に属する)
4つ目は、初回申請金額が予算と同じテストケース(テスト1,3に属する)
内蔵関数reduceのコードを使用します(効率はやや低い).
繰り返すたびにreduceチェックを呼び出し、popも必要なので効率が悪い・・・(woorim960)
function solution(d, budget) {
    d.sort((a, b) => a - b);

    while (d.reduce((a, b) => (a + b), 0) > budget) d.pop();

    return d.length;
}