백준 회전하는 큐 코드 및 해설 (파이썬)

2021. 6. 8. 12:14algorithm

반응형

https://www.acmicpc.net/problem/1021

 

1021번: 회전하는 큐

첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가

www.acmicpc.net

 

RotatingQueue라는 클래스를 정의하여 문제에 주어진 연산1,2,3을 구현했습니다.
뽑아야 하는 숫자들의 리스트를 targets로 정의하고, 이 숫자들을 하나씩 뽑으면서 현재 큐의 첫 번째 원소면 count 증가 없이 바로 연산1 수행, 앞쪽에 있으면 첫 번째 원소가 될 때까지 연산2를 수행하고, 수행한 횟수만큼 count 증가, 뒷쪽에 있으면 첫 번째 원소가 될 때까지 연산3을 수행하고, 수행한 횟수만큼 count를 증가시켰습니다.
마지막으로 count를 반환합니다.

 

from collections import deque 
import sys

class RotatingQueue:
    def __init__(self, N):
        self.queue = deque(range(1, N+1))
        
    # 첫 번째 원소를 뽑아낸다. 이 연산을 수행하면, 원래 큐의 원소가 a1, ..., ak이었던 것이 a2, ..., ak와 같이 된다.
    def computation1(self):
        self.queue.popleft()
        return self.queue
    
    # 왼쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 a2, ..., ak, a1이 된다.
    def computation2(self):
        first = self.queue.popleft()
        self.queue.append(first)

        
    # 오른쪽으로 한 칸 이동시킨다. 이 연산을 수행하면, a1, ..., ak가 ak, a1, ..., ak-1이 된다.
    def computation3(self):
        last = self.queue.pop()
        self.queue.appendleft(last)

# 입력 받아오기 
inputs = list(map(int, sys.stdin.read().split()))
N = inputs[0]
M = inputs[1]
targets = inputs[2:]
        
rq = RotatingQueue(N)

count = 0

for target in targets:
    # 뽑아야 하는 숫자가 맨 앞에 있는 경우 
    if target == rq.queue[0]:
        # 연산1 수행 
        rq.computation1()
    
    # 뽑아야 하는 숫자가 앞쪽에 있는 경우 
    # 맨 앞에 올 때까지 연산2 수행, 수행한 만큼 count 증가 
    elif rq.queue.index(target) < len(rq.queue)//2 + 1:
        while target != rq.queue[0]:
            rq.computation2()
            count += 1 
        # 맨 앞에 오면 연산1 수행 
        rq.computation1()
        
    # 뽑아야 하는 숫자가 뒷쪽에 있는 경우
    # 맨 앞에 올 때까지 연산3 수행, 수행한 만큼 count 증가 
    else:
        while target != rq.queue[0]:
            rq.computation3()
            count += 1   
        # 맨 앞에 오면 연산1 수행 
        rq.computation1()

print(count)
반응형