Greedy(Cotte)-スポーツウェア


問題の説明
昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、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
    コード#コード#
    def solution(n, lost, reserve):
        answer = 0
        
        # 체육복을 도난당하고 여분의 체육복이 없는 학생
        new_lost = set(lost) - set(reserve)
        new_reserve = set(reserve) - set(lost)
        
        # for i in lost: # new_lost 체육복을 도난당하고 여분의 체육복이 없는 학생
        #   if i not in reserve:
        #     new_lost.append(i)
        #   else:
        #     reserve.remove(i)
        
        for i in new_lost: # 체육복을 빌릴 수 있는 학생들
            if i-1 in new_reserve:
                new_reserve.remove(i-1)
            elif i+1 in new_reserve:
                new_reserve.remove(i+1)
            else:
                n -= 1
            
        answer = n
                
        return answer
    フィードバック
    初めて問題を見て答えたとき、テスト用例は合格し、実際の採点段階でテスト用例にブロックされた.そこで悩んだあげく、どこかで問題が発生したのか分からず、問題で運動服を何着も持っていた学生が盗まれた可能性があることに気づいた.
    既存の私が作成したコードは、コメントを処理するコードです.ドアを通って運動服を盗まれたが、余った運動服の学生を予備隊から排除し、運動服を借りられる学生を探した.
    採点結果はすべてのテストに合格した.
    コメントコード
    他の人の解答を見ることでsetを利用して差分演算で交差要素を排除する方法も存在し,set関数を利用して配列を定義しforゲートを迂回し,運動服を借りることができる学生を見つけた.
    心得
    問題を読むときは、要求事項を正確に把握し、問題解決が重要であることに気づく.