[programmers][Python]スポーツウェア

7169 ワード

質問する




に答える


Trual 1 stプール

def solution(n, lost, reserve):
    
    for ans in lost:
        if ans-1 in reserve:
            reserve.remove(ans-1)
        elif ans+1 in reserve:
            reserve.remove(ans+1)
        else:
            n-=1
    
    return n
最初は、すべての状況で完璧な解を見つけたいと思っていましたが、この問題はgreedyの方法で解決する必要があることに気づき、一歩一歩最適な解を求める方法を採用しました.
  • lossを迂回して、大きな値または小さい値がreserveにある場合、その値はreserveから削除されます.
  • 両とも不可能であればユニフォームを借りることができない生徒なので、全体生徒数で1を減算します.
  • Trial 1結果



    いくつかのテックに失敗した.
    探していたのかもしれませんが、もう一度問題を見て、制限事項で見逃した部分を見つけました.
  • 着以上の運動服を持っている学生は盗まれたかもしれません.このとき、この学生は1枚の運動服だけが盗まれたと仮定し、1枚の運動服しか残っていないため、他の学生に運動服を貸すことができない.
  • lossとreserveには重複する番号がある場合があります.では、各リストの重複値をどのように除去しますか?forドアを回して、notinで独特の要素だけを持ってきますか?
    もっと賢い方法があるかどうか調べてみると、Pythonには生成者setがいることがわかりました.
    s1 = {} #set 선언
    s2 = {1, 2, 3, 4} #set에 원소 넣기
    s2 = set(list1) #list를 set으로 변경
    s3 = set([1, 2, 3]) #set에 list 넣기
    ジャンプ
    集合の演算子は、集合、交差、差分、対称差分をサポートする名前で実装されます.
    繰り返し要素(繰り返し入力自動消去)は許可されず、順序は保存されていないため、forゲートを回転するのはどこから始まるか分かりません.
    この問題ではset演算子の差分(-)機能を用いると,オーバーラップした要素を迅速に除去でき,O(1)ターンゲートを用いるよりも時間的複雑度がはるかに速い.△与えられた学生数は30を超えないので、本題でfor文を使っても大きな問題はありません.
    diff_lost = set(lost) - set(reserve)
    diff_reserve = set(reserve) - set(lost)

    Trual 2 ndプール

    def solution(n, lost, reserve):
    
        diff_lost = set(lost) - set(reserve)
        diff_reserve = set(reserve) - set(lost)
    
        for ans in diff_lost:
            if ans-1 in diff_reserve:
                diff_reserve.remove(ans-1)
            elif ans+1 in diff_reserve:
                diff_reserve.remove(ans+1)
            else:
                n-=1
    
        return n
    結果は成功!