[programmers/Python/スタックキュー]-プリンタ


ソース:https://programmers.co.kr/learn/courses/30/lessons/42587
印刷待ちリスト
  • から、先頭の文書(J)を取り出す.
  • 残りの
  • 個の印刷対象リストにJよりも重要なドキュメントがある場合は、Jを印刷対象リストの最後に配置します.
  • でなければJを印刷します.

  • 優先度がpop(0)であっても、初期インデックスlocationを保存する方法が考えられます.
    最初はリストを単独で作成して管理したいと思っていましたが、この場合は優先度が変わるにつれて位置リストも一緒に変更されるので面倒です.
    そこでlist(列挙(priority)によってスタックリストにメタグループ形式(location:priority)でこのように入れ、優先度を元に保ち、スタック変形でコードを記述する.

    私の答え

    def solution(priorities, location):
        answer = 0
    
        stack = list(enumerate(priorities))
    
        while stack:
            for i in range(len(stack)):
                if stack[i][1] == max(list(map(lambda x:x[1], stack))):
                    stack = stack[i:] + stack[:i]
                    answer += 1
                    
                    if stack[0][0] == location:
                        return answer
                
                    stack.pop(0)
                    break
        

    コードの説明

  • は、各優先度要素をtuple形式(位置:優先度)スタック
  • として列挙する.
    stack = list(enumerate(priorities))
  • スタック内の要素が存在する場合、while文
  • を実行します.
  • for文を迂回して、各要素の優先度が現在の残りの優先度の最大値であるかどうかを確認します.
  • の最低価格優先度がある場合、スタック要素に基づいてスライスしてスタックを変更します.
    stack = stack[i:] + stack[:i]
  • 回答+=1が完了すると、その要素の位置が要求された文書である場合、関数
  • に戻り、終了する.
  • 要素の場所が要求されたドキュメントでない場合、スタック.Pop(0)は、break文でfor文を終了し、while文
  • を再実行します.
            for i in range(len(stack)):
                if stack[i][1] == max(list(map(lambda x:x[1], stack))):
                    stack = stack[i:] + stack[:i]
                    answer += 1
                    
                    if stack[0][0] == location:
                        return answer
                    
                    stack.pop(0)
                    break