プリンタ(プログラマの質問)Python


質問リンク:https://programmers.co.kr/learn/courses/30/lessons/42587
各印刷順序の優先順位を含む配列順序と、私たちが探している印刷位置のlocation入力を入力すると、対応するlocationの印刷は何回目の印刷の問題です.
ただし、以下の3つの方法で印刷が行われます.
1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.

説明する


1.最初


問題を見て、最大値を基準に左のブロックを全部右の末尾に貼って、最大値を落とす過程を繰り返すだけでいいと思います.
def solution(priorities, location):
    answer = 1

    length = len(priorities)

    while 1:
        idx_max_priorities = priorities.index(max(priorities))
        
        ## 옮기기
        left_max = priorities[:idx_max_priorities]
        
        # 가장 큰 값 왼쪽에 있는 경우
        if location < idx_max_priorities:
            location += (length - len(left_max))
        # 가장 큰 값 오른쪽에 있는 경우
        elif location >= idx_max_priorities:
            location -= len(left_max)
            
        # 왼쪽 항목 제거 후, 왼쪽 배열을 오른쪽에 붙임
        del priorities[:idx_max_priorities]
        priorities += left_max
        
        if location == 0:
            break
        else:
            location -= 1
            del priorities[0]

        answer += 1

    return answer
だから私たちは上のコードに従って行いました.
1. 배열 안에 있는 가장 큰 값을 확인한다.
2. 가장 큰 값을 기준으로 왼쪽에 위치한 값들을 오른쪽으로 옮긴다. 이때, location 값도 변경을 진행해준다.
3. 1,2번 과정을 거친 후에 location이 0번이라면 break를 진행해주고, 0번이 아니라면 현재 가장 앞에 있는 프린트를 인쇄해주고(제거해주고) location값에서 -1를 해준다.
もう一度説明しますが、上記の手順はwhile文で行われています.

結果



テストケースはすべて合格しましたが、実際の結果は惨めでした...

他人を解く


他の人がどのように解決したか見てみましょう.
def solution(priorities, location):
    answer = 0
    m = max(priorities)

    while True:
        v = priorities.pop(0)
        if m == v:
            answer += 1
            if location == 0:
                break
            else:
                location -= 1
            m = max(priorities)
        
        else:
            priorities.append(v)
            if location == 0:
                location = len(priorities) - 1
            else:
                location -= 1

    return answer
思ったよりアルゴリズムが簡単・・・
私の場合、最大値を基準に左側のブロックを右側に移動して解凍する方法を使用していますが、私がインポートした解答では、優先度の一番前の値が最大値と同じであれば、印刷して答えに1を追加します.そうでなければ、優先度の一番後ろに値を送信します.この操作を繰り返し、locationが0の場合はbreakを使用してリターンします.

結果