백준 회전하는 큐 코드 및 해설 (파이썬)
2021. 6. 8. 12:14ㆍalgorithm
반응형
https://www.acmicpc.net/problem/1021
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)
반응형
'algorithm' 카테고리의 다른 글
DFS, BFS (0) | 2021.06.22 |
---|---|
백준 트리 순회 코드 및 해설 (파이썬) (0) | 2021.06.08 |
프로그래머스 로또의 최고 순위와 최저 순위 코드 및 해설 (파이썬) (0) | 2021.06.08 |
프로그래머스 멀쩡한 사각형 코드 및 해설 (파이썬) (0) | 2021.06.02 |
프로그래머스 기능개발 코드 및 해설 (파이썬) (0) | 2021.06.02 |