Baekjoon/IM Level

[백준] 1966 프린터 큐 (실버3) / 큐

hellosonic 2023. 3. 25. 11:15

문제요약

나의 코드 및 설명

  • 우선순위가 높은 프린트물을 출력(popleft())하더라도 구하려고 하는 인덱스를 계속 추적함으로써 구하려고 하는 인덱스가 0에 위치해 있다면 반복문을 종료하는 코드를 작성하였다.
  • ans_idx : 먼저, 현재 입력받은 값에서, 구하려고 하는 인덱스 정보를 저장한다.
  • while문에서, 현재 큐 안에 우선순위가 가장 큰 인덱스를 찾아서 해당 요소를 큐의 맨 앞에 위치하도록 for문을 수행한다.
    for문을 수행했다면, 원래 찾으려고 했던 인덱스도 변화되었을 것이고, 어디에 있는지 찾아준다.
    만약 찾으려고 했던 인덱스가 맨 앞에 위치해 있다면 현재까지 프린트물을 몇 번 출력했는지 정보를 저장한 time을 출력하고 반복문을 탈출한다. 만약 찾으려고 했던 인덱스가 뒤에 위치해 있다면, 맨 앞의 프린트물을 출력하고, 찾으려던 인덱스 - 1 해준다.(인덱스 0 이 빠졌으므로)
from collections import deque
n = int(input())

for _ in range(n):
    page ,sequence = map(int,input().split())
    queue = deque(map(int, input().split()))

    #구하려고 하는 인덱스(pop() 메서드 따라 구하려는 인덱스도 변동되어야한다.)
    ans_idx = sequence 
    #몇 번째로 출력하는지 세기 위한 변수
    time = 1 
    while True:
        #현재 큐 중 우선순위가 가장 큰 인덱스를 구한다.
        max_idx = queue.index(max(queue)) # 3 # 2
        #우선순위가 가장 큰 인덱스의 이전 인덱스까지 popleft()를 통해 뒤에다 붙인다.
        # [1,2,3,4] -> [4,1,2,3]
        for _ in range(max_idx):
            queue.append(queue.popleft())
        #popleft()를 통해 요소의 위치가 변화가 일어남에 따라, 
        #원래 찾으려는 인덱스는 어디에 있는지 찾는다.
        ans_idx = (ans_idx + len(queue) - max_idx) % len(queue)
        #만약 찾으려는 인덱스의 위치가 현재 idx 0 에 있다면, 맨 앞에 있는 것이고
        #출력 순서가 된 것이므로 time을 출력하고 반복문을 탈출한다.
        if ans_idx == 0:
            print(time)
            break
        #찾으려는 인덱스의 위치가 idx 0 이 아니라면,
        else:
            #맨 앞에 있는(우선순위가 가장 높은) 프린트를 출력하고
            queue.popleft()
            #앞의 프린트가 출력이 되었으므로, 찾으려는 인덱스 위치는 한 칸 앞으로 간다.
            ans_idx -= 1
            #출력이 되었으므로 출력 횟수를 표시하는 변수인 time에 1을 더해준다.
            time+=1

피드백

1시간 10분 정도 걸려서 푼 것 같다. 자료구조 문제를 연습해보고 싶어서 풀어본 문제인데, 재밌게 풀었던 것 같다. 사실 풀 때에는 풀이 과정도 중구난방이었는데, 어? 이렇게 하면 되겠네? 를 반복하다가 비교적 깔끔하게 코드를 작성한 것 같다.

내 힘으로 문제를 해결해서 참 뿌듯하다. 그러나 시간 단축은 앞으로도 숙제인 것 같다. ㅠ