회전하는 큐

bird.j·2021년 3월 11일
0

백준

목록 보기
55/76

백준 1021


방법1. 덱을 이용하여 회전하는 큐를 구현한다.


from collections import deque

n, m = map(int, input().split())
pick = list(map(int, input().split()))

arr = []
arr = deque()
for i in range(1, n+1):
    arr.append(i)

cnt = 0
for ele in pick:
    if arr.index(ele) == 0:
        arr.popleft()
    else:
        if arr.index(ele) <= len(arr)-arr.index(ele):
            for _ in range(arr.index(ele)):
                cnt += 1
                arr.append(arr.popleft())
            arr.popleft()
        elif arr.index(ele) > len(arr)-arr.index(ele):
            for _ in range(len(arr)-arr.index(ele)):
                arr.appendleft(arr.pop())
                cnt += 1
            arr.popleft()
print(cnt)

뽑고자하는 원소의 위치를 pick리스트에 저장한다.
위치가 1보다 크거나 같고 N보다 작거나 같다고 했으므로 1부터 N만큼의 위치 원소를 저장하는 arr를 만든다. 이 arr가 회전하는 큐가 되어야하므로 덱으로 할당한다.
알고리즘 방식은 뽑고자 하는 원소를 arr에서 찾고 arr에서의 위치를 반환한다.
이 위치는 앞에서부터의 위치인데, 뒤에서부터의 위치와 비교해서 더 작은 쪽으로 숫자를 밀어야한다. 만약 뽑고자 하는 원소가 제일 처음에 있다면 바로 pop한다. 미는 방식은 덱의 popleft와 append, pop과 appendleft를 사용하였다. 민 만큼 카운트를 해주고 최종 카운트를 출력해주면 된다.

덱에 관한 모듈 더 알아보기
파이썬에서 큐 사용하기

0개의 댓글