プログラマ-プリンタ


使用言語:python 3.7.4

❓ Problem


問題の説明


プログラムプリンタ

🚩 Solution


1.方法


資料構造キューを思い出しました.
ロケはリアルタイムになります.
位置決め要素が位置すると、その位置に戻り、終了します.
[具体的な手順]
  • (繰り返し開始)キューの最初の要素p(リストの一番左側)を取り出します.
  • pと待機リストの値のサイズを比較します.
  • 待機リストの値がpより大きい場合
  • pをキューの最後に送信します.
  • 領域が0に設定されている場合、領域設定値はlen-1に変更されます.
  • 領域設定が0でない場合、領域設定値-1が設定されます.
  • (繰り返し開始)に戻り、最初の要素を再び取り出してから繰り返し操作を開始します.
  • 待機リストにpより大きな値がない場合
  • pをキューから取り出し、保存済みの印刷順序のリストarrに挿入します.
  • の位置決め値が0の場合、arrの長さ(正しい)を返し、終了します.
  • のロケーション値が0でなければ、ロケーション値-1になります.
  • (繰り返し開始)に戻り、最初の要素を再び取り出してから繰り返し操作を開始します.
  • 以下では,コードを記述する前に,上記の手順を首都コードとして記述する.
    #반복
        (1)처음 거를 뽑는다
        대기열 확인
        if 더 큰 값이 있으면
            현재값을 가장 뒤로 보냄
            if 로케이션이 0이였으면 len-1로 변경
            else 로케이션 -1
    
        else 더 큰 값이 없으면
    
            pop,완성 리스트에 삽입
            if 로케이션이 0이였으면
                완성된 리스트 길이를 리턴하고 종료
            else
                로케이션 -1
                다시 (1)로 돌아감

    2.コード

    from collections import deque
    def solution(priorities, location):
        arr = []
        queue = deque(priorities)
    
        while True:
            p = queue[0]
            big = 0 # big 초기화
            for i in range(1, len(queue)):
                if(p < queue[i]):
                    big = 1
                    break
    
            if big == 1:
                queue.append(p)
                queue.popleft()
                if location == 0:
                    location = len(queue) - 1
                else:
                    location -= 1
                continue
    
            else:
                arr.append(queue.popleft())
                if location == 0:
                    answer = len(arr)
                    return answer
                else:
                    location -= 1
                    continue
    

    3.結果


    採点結果


    correct

    じかんふくごうどぶんせき


    📕 フィードバック


    1.検索内容

  • キュー、DEXを書くにはCollectionsモジュールをインポートします.from collections import deque
  • Python DEQ用法:https://excelsior-cjh.tistory.com/962
  • 2.ミス


    big初期化が行われなかったため,無限ループに陥った.

    3、発展方向

    any()の代わりに
  • を使用して、より高い価格があるかどうかを調べることができます.
  • any()本物が1つあれば本物に戻ります.(逆に、all()はすべてTrueでなければTrueに戻らない.)

  • カップル同士で大きさの比較ができます.サイズ比較は最初の要素から始まります.

  • arrに単独で保存せず、位置を特定すれば+1と答えることもできます.
  • メモリ管理では、後でarr長を返すよりも、anowerを1つ増やすごとに効率的です.
    次は、他の人の解答を印刷し、どのように返すかを確認するコードです.
    def solution(priorities, location):
        queue =  [(i,p) for i,p in enumerate(priorities)]
        print("초기 큐:",queue)
    
        answer = 0
    
        while True:
            print("<while 내부>")
            cur = queue.pop(0)
            print("cur =",cur)
            print("팝한 후 큐 =", queue)
    
            if any(cur[1] < q[1] for q in queue):
                print("큰 값 있음, 맨 뒤로 보내기")
                queue.append(cur)
            else:
                print("큰 값 없음, 위치 확정")
                answer += 1
                print("answer = ", answer)
                if cur[0] == location:
                    print("location의 위치. 정답")
                    return answer
            print()
    
    print(solution([1,1,9,1,1,1],0))

    4.感じ


    25-30分以内にアイデアを思いついた.
    ノートに問題を解く過程を書いて、どのように問題を解くかを考えます.首都コードを作成した後、私の首都コードが欲しい答えを得たかどうか、手順に従って検討し、コードの作成に移りました.
    コードに移動する時間は30分を超えています.
    まず、PythonはQとDEXの使い方が分からないので、importから検索します.また,C++を用いる場合とpop()の動作過程が異なるため,push,popの戻り値やどの位置にアクセスする値などを知る必要がある.
    早めに勉強してから解決すればいいと思います.
    プログラマーレベル2の問題を早く解決したい
    どうすればもっと早くアイデアを思いつくことができますか?
    まず、多くの問題を解いて、他人のコードを真剣に分析しなければなりません.