スポーツウェア


ソース
[プログラマー]ユニホーム
問題の説明
昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、4番の学生は3番か5番の学生にしか運動服を貸すことができません.運動服がないと授業を受けられないので、適当に運動服を借りて、できるだけ多くの学生に体育の授業をさせなければなりません.
すべての学生の数n,ジャージを盗まれた学生の番号の並びloss,複数のジャージを持った学生の番号の並びreserveをパラメータとした場合,解関数を書いて体育の授業を受けられる学生の最上位値を返してください.
せいげんじょうけん
  • 全体の生徒数は2名以上30名以下であった.
  • 運動服を盗まれた生徒数は1名以上n名以下で重複番号はない.
  • 着以上のユニフォームの学生数は1名以上n名以下で、重複番号はありません.
  • 着以上の運動服を持っている学生だけが他の学生に運動服を貸すことができます.
  • 着以上の運動服を持っている学生は盗まれたかもしれません.このとき、この学生は1枚の運動服だけが盗まれたと仮定し、1枚の運動服しか残っていないため、他の学生に運動服を貸すことができない.
  • I/O例
    nlostreservereturn5[2, 4][1, 3, 5]55[2, 4][3]43[3][1]2
    I/O例説明
    例1
    1番学生は運動服を2番学生に貸し、3番学生または5番学生は運動服を4番学生に貸し、5人は体育の授業を受けることができる.
    例2
    3番の学生は運動服を2番の学生か4番の学生に貸して、4人の学生は体育の授業を受けることができます.
    問題を解く
    いくつかのテストケースに合格できず、長い時間がかかった問題です.
    他の人の解答を参考にしながら、ソートが必要だと気づきます.(全く思わなかった…)
  • realLostはスポーツウェアを0着しか残していません.
  • realsには2つの運動服しか残っていない.(同じ2枚ですが、盗難者は排除)
  • 0人が2人の前または後ろにいれば借りることができるのでrealLostから除外します.(0)
  • 全体の学生数からrealLost(値が0ではない)の数を減算します.
  • function solution(n, lost, reserve) {
        let realLost = lost.filter(e => !reserve.includes(e)).sort();
        let realRes = reserve.filter(e => !lost.includes(e)).sort();
        
        for (let i=0; i<realRes.length; i++) {
            for (let j=0; j<realLost.length; j++) {
                if (realLost[j] === realRes[i]-1 || realLost[j] === realRes[i]+1) {
                    realLost[j] = 0;
                    break;
                }
            }
        }
        return n - realLost.filter(e => e).length;
    }