[python]ジャージ


欲張り法>スポーツウェア
[問題の説明]
昼食の時間に盗まれ、一部の学生の運動服が盗まれた.幸いなことに、余分な運動服を貸したい学生がいます.学生の番号は体格順で、前の番号の学生か後ろの番号の学生の運動服しか貸せません.例えば、4番の学生は3番か5番の学生にしか運動服を貸すことができません.運動服がないと授業を受けられないので、適当に運動服を借りて、できるだけ多くの学生に体育の授業をさせなければなりません.
すべての学生の数n,ジャージを盗まれた学生の番号の並びloss,複数のジャージを持った学生の番号の並びreserveをパラメータとした場合,解関数を書いて体育の授業を受けられる学生の最上位値を返してください.
[制限]
  • 全体の生徒数は2名以上30名以下であった.
  • 運動服を盗まれた生徒数は1名以上n名以下で重複番号はない.
  • 着以上のユニフォームの学生数は1名以上n名以下で、重複番号はありません.
  • 着以上の運動服を持っている学生だけが他の学生に運動服を貸すことができます.
  • 着以上の運動服を持っている学生は盗まれたかもしれません.このとき、この学生は1枚の運動服だけが盗まれたと仮定し、1枚の運動服しか残っていないため、他の学生に運動服を貸すことができない.
  • [I/O例]

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

    考えてみろ!

    def solution(n, lost, reserve):
        
        lost.sort()
        reserve.sort()
        
        clothes = list(set(range(1,n+1)) - set(lost))
        
        # 여벌 체육복을 가져온 학생이 도난당한 경우
        for i in lost : 
            if i in reserve :
                clothes.append(i)
                lost[lost.index(i)] = -1
                reserve[reserve.index(i)] = -10
         
        # 여벌 체육복을 바로 앞번호와 뒷번호 학생에게 빌려주는 경우        
        for i in lost :        
            if i-1 in reserve :
                clothes.append(i)
                lost[lost.index(i)] = -1
                reserve[reserve.index(i-1)] = -10
                
            elif i+1 in reserve :
                clothes.append(i)
                lost[lost.index(i)] = -1
                reserve[reserve.index(i+1)] = -10
    
        return len(clothes)

  • 盗まれた学生の運動服番号が入った配列fastと、女性の運動服を持ってきた学生番号が入った配列reserveを昇順に並べます.

  • 服=全生徒-盗難生徒
    つまり、運動服を借りる前に体育の授業を受けることができる学生のリストです.
    二つのケースを考えて、解いてみましょう!

  • 余分な運動服を着た学生が盗まれた場合.
  • 盗難学生の運動服を貸してはいけません.先に解決します.
  • lost[lost.index(i)] = -1
    要素を削除せずに、インデックス値をプールに影響を与えない値に変更します.

  • 余った運動服を前号と後号の学生に貸す
  • の上のfor文のようなコードにelifという条件文を追加し,2つのケース(前後番号の学生)を考慮した.
  • の最初の採点結果によれば、運転時に誤審により45点を得た.その後、多くの間違った試みと質問のアドバイスを通じて、問題を解決しました.
    実行時にエラーを解決!
  • 新規テストケース13、14
  • の運動服を失った学生と、複数の運動服を持っている学生を昇順に整理します.
  • 前後の学生に貸しているので並べ替えが必要!間違った答えを解決!
  • for文の実行中にremove()関数を使用してリスト要素を削除中にエラーが発生しました
  • インデックス順に実行されるため、削除後は次の要素を使用してfor文は実行されません.
  • 要素を除去せず、解題に影響しない要素(-1,-10)の値で置き換えます.

  • for文を書くとき、実行部分で変数を含むリストの要素()を削除すると、変数にエラーが発生する可能性があります.

    他の人の解答#1
    def solution(n, lost, reserve):
        _reserve = [r for r in reserve if r not in lost] # 빌려줄 수 있는 학생
        _lost = [l for l in lost if l not in reserve] # 빌려야하는 학생
        for r in _reserve:
            f = r - 1
            b = r + 1
            if f in _lost:
                _lost.remove(f)
            elif b in _lost:
                _lost.remove(b)
        return n - len(_lost)

    参考にしてください!

  • reserve:貸してくれる学生リスト
  • loss:貸し出しが必要な学生リスト
  • 簡単明瞭な解答!
  • 他の人の解答#2
    def solution(n, lost, reserve):
        answer = 0
        for i in range(1, n+1):
            if i not in lost: #안 잃어버린 학생
                answer += 1
            else:
                if i in reserve: #잃어버렸지만 여분도 있는 학생
                    answer += 1
                    reserve.remove(i)
                    lost.remove(i)
    
        for i in lost: #잃어버리고 여분도 없어서 빌려야 하는 학생
            if i-1 in reserve:
                answer += 1
                reserve.remove(i-1)
    
            elif i+1 in reserve:
                answer +=1
                reserve.remove(i+1)
    
        return answer

    参考にしてください!


    これは
  • 回答変数において,体育の授業を受ける生徒数を加算できるコードである.
  • if文とremove()関数
  • を使用