[프로그래머스] 프린터 풀이

 


1. 문제

https://programmers.co.kr/learn/courses/30/lessons/42586

2. 풀이

2.1. 덱을 이용한 풀이

  • 1~9 까지 우선순위마다 값을 다르게 넣기 위한 덱 배열을 생성합니다. 이후 우선순위에 따라서 숫자를 집어 넣습니다.
  • 우선순위 높은 덱부터 살펴봅니다. 이전에 살펴본 요소를 last_idx 로 표기해놓고, 해당 idx 이후에 실행될 요소를 찾습니다.
  • 이후 큐에 있는 요소들을 순서대로 정답 배열에 집어 넣습니다.
  • 정답 배열에서 location에 해당하는 요소를 찾아 정답으로 출력합니다.
from collections import deque

def solution(priorities, location):
    answer = []
    dequeues = [deque() for _ in range(10)]  # 1~9 까지 우선순위마다 값을 다르게 넣기 위한 덱 배열
    for i in range(len(priorities)):  # 원소 집어 넣기
        dequeues[priorities[i]].append(i)
    last_idx = -1

    # 우선순위 높은 순서부터 덱 살펴보기
    for i in range(9, 0, -1): 
        if len(dequeues[i]) == 0:  # 덱 비어있으면 넘어가기
            continue
        
        # 큐를 한 바퀴 돌면서 이전 단계에서 가장 마지막에 살펴본 요소와 비교하여 먼저 수행될 idx 선택
        for _ in range(len(dequeues[i])): 
            if last_idx < dequeues[i][0]:
                break
            dequeues[i].append(dequeues[i][0])
            dequeues[i].popleft()

        answer.extend(dequeues[i])
        last_idx = dequeues[i][-1] # 마지막 idx 갱신

    for i, x in enumerate(answer):
        if x == location:
            return i + 1        # 정답 출력 
        
    return -1

2.2. 가장 많은 사람들이 추천한 풀이

  • 하나하나 살펴보면서 실제 동작을 구현했습니다.
  • 배열 p 대신에 덱을 쓰면 시간이 더 줄어들 것으로 보여집니다.
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