[백준 1021] 회전하는 큐

Junyoung Park·2022년 2월 26일
0

코딩테스트

목록 보기
87/631
post-thumbnail

1. 문제 설명

회전하는 큐

2. 문제 분석

파이썬의 디큐는 deque.appendleftdeque.append를 통해 왼쪽, 오른쪽 모두 삽입 가능하다. 이를 활용해 원형 큐를 만들자.

  • 원하는 번호의 수가 현재 큐 안에 몇 번째 인덱스인지 확인하고, 주어진 두 가지 연산(즉 0번을 -1번으로, -1번을 0번으로 보내는 연산)을 몇 번 활용해야 그 값이 0번에 올지 계산할 수 있다.

3. 나의 풀이

from collections import deque

queue = deque()

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

for i in range(1, n+1):
    queue.append(i)
    # queue: [1, 2, 3, 4, ..., n] 각 번호는 처음에 놓인 순서를 의미

m_pops = list(map(int, input().split()))
# 이 순서에 해당하는 번호가 0번 인덱스에 와야 추출 가능

cnt = 0

while m_pops:
    idx = queue.index(m_pops.pop(0))
    # 현재 주어진 큐에서 디큐해야 하는 값이 어디에 있는지 확인
    if idx == 0:
        queue.popleft()
        # 가장 앞이라면 cnt 더하지 않아도 추출 가능
    elif idx <= len(queue) // 2:
        for _ in range(idx):
            cnt += 1
            top = queue.popleft()
            queue.append(top)
        queue.popleft()
        # 앞 부분에 있다면 원하는 값이 0번 인덱스에 오도록 그 앞의 값을 뒤로 보낸다.
    else:
        length = len(queue) - idx
        for _ in range(length):
            cnt += 1
            bottom = queue.pop()
            queue.appendleft(bottom)
        queue.popleft()
        # 뒷 부분에 있다면 원하는 값이 0번 인덱스에 오도록 뒤의 값을 앞으로 보낸다.
print(cnt)


profile
JUST DO IT

0개의 댓글