プリンタ


質問する


一般的なプリンタでは、必要な印刷順に印刷されます.したがって、重要なドキュメントは後で印刷される可能性があります.この問題を解決するために,重要文書を先に印刷するプリンタを開発した.この新しく開発されたプリンタは、次のように印刷されます.
1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.
例えば、4つの文書(A、B、C、D)が印刷対象リストに順次存在し、重要度が2 1 3 2の場合、CD A Bの順に印刷される.
私が印刷を要求したドキュメントが何回目の印刷なのか知りたいです.上記の例では、Cは1位、Aは3位である.
ソリューション関数を作成してください.パラメータが現在のキュー・リスト内のドキュメントの重要度のソート順と、印刷を要求したドキュメントが現在のキュー・リスト内にある場所を指定した場合、印刷を要求したドキュメントの何回目の印刷かを返します.

せいげんじょうけん

  • 現在の待機リストには、1つ以上の100個のドキュメントが含まれています.
  • 印刷ジョブの重要性は1から9で表され、数字が大きいほど重要である.
  • の位置の値は0より大きく(現在のキューリストのタスク数-1)、キューリストの先頭に0、2番目の位置に1と表示されます.
  • I/O例


    prioritieslocationreturn[2, 1, 3, 2]21[1, 1, 9, 1, 1, 1]05

    I/O例説明


    例1


    問題の例は次のとおりです.

    例2


    6つの文書(A、B、C、D、E、F)は、印刷対象リストにおいて、重要度が1 1 1 1 9 1 1 1 1であり、C D E F A Bの順に印刷される.

    問題を解く

    def solution(priorities, location):
        answer = 0
        tup=[(i,num) for i,num in enumerate(priorities)]
        
        while len(tup)>1:
            que=tup.pop(0)
    		#1보다 큰 조건문을 두면 tup 길이가 2일때 정확히 계산할 수 없음
            if len(tup)>0:
                list_tup=list(map(lambda x:x[1],tup))
                if que[1]<max(list_tup):
                    tup.append(que)
                else:
                    if que[0]==location:
                        return answer+1
                    else:
                        answer+=1
                        
        return answer+1
    while Trueif len(tup)>0はありませんValueError: max() arg is an empty sequenceエラーが発生しました.tupリストに値がないため、max()演算はできません.while文で繰り返し続けると、tup変数に何の内容もなくても、繰り返し文のためif que[1]<max(list_tup)max演算が行われ、このときすでに空のリストになっているため、演算が実行できないという問題が発生します.

    他人を解く

    def solution(priorities, location):
        queue=[(i,p) for i,p in enumerate(priorities)]
        answer=0
        while True:
            cur=queue.pop(0)
            if any(cur[1]<q[1] for q in queue):
                queue.append(cur)
            else:
                answer+=1
                if cur[0]==location:
                    return answer
    私が書いたコードに似たアルゴリズムです.
    def solution(p, l):
        ans = 0
        m = max(p)
        while True:
            v = p.pop(0)
            if m == v:
                ans += 1
                if l == 0:
                    break
                else:
                    l -= 1
                m = max(p)
            else:
                p.append(v)
                if l == 0:
                    l = len(p)-1
                else:
                    l -= 1
        return ans
    これは時間の複雑さにおいてより効果的な方法である.
    私もこのようにidxの値を減らして、0のインデックス位置を解こうとしましたが、値が0でなければ処理方法が見つからないので、既存の方式を利用しました.