TIL#16 ALGORITHM(ジャージ)


問題の説明
昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、4番の学生は3番か5番の学生にしか運動服を貸すことができません.運動服がないと授業を受けられないので、適当に運動服を借りて、できるだけ多くの学生に体育の授業をさせなければなりません.
すべての学生の数n,ジャージを盗まれた学生の番号の並びloss,複数のジャージを持った学生の番号の並びreserveをパラメータとした場合,解関数を書いて体育の授業を受けられる学生の最上位値を返してください.
せいげんじょうけん
全生徒数は2名以上30名以下である.
運動服を盗まれた生徒数は1名以上n名以下で、重複番号はない.
複数のユニホームを着用した生徒数は1名以上n名以下であり,重複番号はない.
余分な運動服を持っている学生だけが他の学生に運動服を貸すことができる.
複数の運動服を持ってきた学生は、運動服が盗まれたのかもしれない.このとき、この学生は1枚の運動服だけが盗まれたと仮定し、1枚の運動服しか残っていないため、他の学生に運動服を貸すことができない.
I/O例
n lost reserve return
5 [2, 4][1, 3, 5] 5
5 [2, 4][3] 4
3 [3][1] 2
def solution(n, lost, reserve):
    new_reserve = set(reserve) - set(lost)
    new_lost    = set(lost) - set(reserve)
    
    for i in new_reserve:
        if i-1 in new_lost:
            new_lost.remove(i-1)
            
        elif i+1 in new_lost:
            new_lost.remove(i+1)
            
    return n - len(new_lost)
1.逆配列のセットを作成し、要素から失われた要素と重複した要素を削除します.
2.繰り返し集合の場合、new reverse要素の+1がnew loss集合に存在する場合、その集合を削除する
3.スマート数-コレクションの長さを削除