[コードテスト]プログラマー(第2段階)-救命ボート


こんにちは!私は金容成です.
昨日に続いて今日もプログラマーコードテストについて話し合いましょうこの問題は2級救命ボートの問題です.

質問する


プログラマー-救命ボート
問題の説明
無人島に閉じ込められている人を救命ボートで救い出したい.救命ボートは小さく、1回に最大2人しか乗れず、重量制限もあります.
例えば、人々の体重が[70 kg、50 kg、80 kg、50 kg]であり、救命ボートの重量制限が100 kgであれば、2人目と4人目は一緒に乗ることができるが、1人目と3人目の重量の和が150 kgであるため、救命ボートの重量制限を超えて一緒に乗ることはできない.
できるだけ救命ボートで全員を助けないようにしたい.
特定の人の体重の配列と救命ボートの重量制限をパラメータとして使用する場合は、すべての人を救うために必要な救命ボートの数の最大値を返す解関数を作成します.
せいげんじょうけん
無人島に閉じ込められている人は1人以上50000人以下です.
一人当たりの体重は40キロ以上240キロ以下です.
救命ボートの重量は40キロまたは240キロ以下に制限されている.
救命ボートの重量制限はいつも人々の体重の中で最低価格より大きいので、助けられない人はいません.

に答える


この問題のタイプはグレーで、PythonコレクションライブラリのDequeを使用して簡単に解決できます.
Dequeについて定義したpostingがあるので、参考にしてから来てもいいので、リンクを掛けます:)
[資料構造論]Cレコーダを作成する
問題の条件をゆっくり見ると、船は最大2人まで乗れます.じゃ、そう思いますか.

  • 体重が一番重い人と一番軽い人を合わせると、体重がオーバーすると?=>重い人は一人で燃える.リストから削除します.

  • 体重が一番重い人と一番軽い人を合わせたときに体重を超えなければ?=>彼ら二人を一緒に焼いて、船の戸棚を増やします.

  • 反復文はいつまでですか.最大2人まで、people dequeの長さが1になるまで乗せることができます.

  • もし体重が一番少ない人が限界より大きいとしたら?=>再びpeople dequeに追加
  • 理解できますか?私がdequeを使う最大の原因はpopleftで、popは体重が最も重い人と最も軽い人を簡単に取り出すことができます.

    最終コード

    from collections import deque
    def solution(people, limit):
        answer = 0
        initial_limit=limit
        
        peopleArray=deque(sorted(people))
        
        while len(peopleArray)>1:
            limit-=peopleArray.pop()
            min_value=peopleArray.popleft()
            if limit<min_value:
                peopleArray.appendleft(min_value)
            answer+=1
            limit=initial_limit
            
        return answer+len(peopleArray) #마지막에 요소가 남았을 시에는 그만큼을 더해줌

    効率検査にも合格しました.

    の最後の部分


    最初はwhileゲート内部でforゲートを実行するようにアクセスしていましたが、ifゲートを一度書けば効率も通ると思いました.sort自体に一度やらせることは効率の向上に役立ちます.
    今日は私たちの位置づけを読んでくれてありがとう:)