[プログラマー]ユニホーム


スポーツウェア

問題の説明


昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、4番の学生は3番か5番の学生にしか運動服を貸すことができません.運動服がないと授業を受けられないので、適当に運動服を借りて、できるだけ多くの学生に体育の授業をさせなければなりません.
すべての学生の数n,ジャージを盗まれた学生の番号の並びloss,複数のジャージを持った学生の番号の並びreserveをパラメータとした場合,解関数を書いて体育の授業を受けられる学生の最上位値を返してください.

せいげんじょうけん

  • 全体の生徒数は2名以上30名以下であった.
  • 運動服を盗まれた生徒数は1名以上n名以下で重複番号はない.
  • 着以上のユニフォームの学生数は1名以上n名以下で、重複番号はありません.
  • 着以上の運動服を持っている学生だけが他の学生に運動服を貸すことができます.
  • 着以上の運動服を持っている学生は盗まれたかもしれません.このとき、この学生は1枚の運動服だけが盗まれたと仮定し、1枚の運動服しか残っていないため、他の学生に運動服を貸すことができない.
  • 私の答え

    function solution(n, old_lost, old_reserve) {
        let answer = 0;
        let lost = old_lost.filter(x => !old_reserve.includes(x));
        let reserve = old_reserve.filter(x => !old_lost.includes(x));
        
        lost.sort((a, b) => a - b);
        reserve.sort((a, b) => a - b);
        
        for(let i = 0; i < lost.length; i++){
            for(let j = 0; j < reserve.length; j++){
                if(lost[i] + 1 === reserve[j] || lost[i] - 1 === reserve[j]){
                    lost.splice(i, 1);
                    reserve.splice(j, 1); 
                    i--;
                    j--;
                }
            }
        }
        answer = n - lost.length;
        return answer;
    }

    他人の解答

    function solution(n, lost, reserve) {
        let tmp = reserve.slice()
    
        for (let i in tmp) {
          let key = lost.indexOf(tmp[i])
    
          if (key != -1) {
            lost.splice(key, 1);
            reserve.splice(reserve.indexOf(tmp[i]), 1);
          }
        }
    
        for (let i of reserve) {
          let key = lost.includes(i-1) ? lost.indexOf(i-1) : lost.indexOf(i+1)
    
          if (key != -1) {
            lost.splice(key, 1)
          }
        }
    
        return n - lost.length
      }

    P.S.


    この問題には多くの制限要因があり,コードが正しい答えに続くのに多くの時間がかかった.😅
    私はfilterを使用してlossとreserveの重複要素を除去し、昇順に並べて、重複文内にloss 1以上またはloss未満の要素を見つけ、対応するlossとreserveをつなぎ合わせて除去した.そして,接合によって引き出された配列を正常に読み取るために,1つの繰返し文のカウンタ変数を減らした.
    人の解答を見る.
    1.sliceを使用してreserveをtmpという変数にコピーします.
    2.tmpで繰り返されるloss要素のインデックスを検索し、keyという変数に代入し、値がない場合はspliceで対応するloss要素とreserve要素を削除します.
    3.reserve要素がloss要素1より大きいか小さい場合、そのloss要素のインデックスを求めて鍵に入れ、同様に値がある場合、要素を削除して最終的なloss配列長を求める.
    配列の要素ではなく、インデックスで条件を作成し、sliceで配列をコピーして使用したのが印象的でした.
    昇順でソートするのではなく、問題がどのように解決されたのかを検索し、順序を保証しない特性for...inという個体の特性から,昇順に配列した性質を有することが分かった.そして、このように属性に依存するのはよくないスタイルだと知っています.😉