スポーツウェア[レベル1]Python


問題の説明


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

せいげんじょうけん

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



    I/O例説明


    例1
    1番学生は運動服を2番学生に貸し、3番学生または5番学生は運動服を4番学生に貸し、5人は体育の授業を受けることができる.
    例2
    3番の学生は運動服を2番の学生か4番の学生に貸して、4人の学生は体育の授業を受けることができます.

    その他のテストケース


    n(int): 3
    lost(int[]): [3]
    reserve(int[]): [1]
    Return: 2
    n(int): 5
    lost(int[]): [2, 4]
    reserve(int[]): [3, 1]
    Return: 5
    n(int): 6
    lost(int[]): [1, 3, 5]
    reserve(int[]): [2, 4, 6]
    Return: 6
    n(int): 5
    lost(int[]): [1, 2, 3]
    reserve(int[]): [2, 3, 4]
    Return: 4

    コード(時間複雑度O(n^2)

    def solution(n, lost, reserve):
        answer = 0
        _reserve = list(set(reserve) - set(lost))
        _lost = list(set(lost) - set(reserve))
    
        print(_lost, _reserve)
        for i in _reserve: -> O(n) 시간 복잡도
            if i-1 in _lost: 
                _lost.remove(i-1) -> O(n) 시간 복잡도
            elif i+1 in _lost:
                _lost.remove(i+1)
        	print(_lost, _reserve)
        
        return n - len(_lost)