알고리즘 공부/백준

(Python)백준 코딩테스트 연습 - 회전하는 큐(1021)

HRuler 2023. 1. 15. 16:16

1. 문제

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

 

1021번: 회전하는 큐

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

www.acmicpc.net

2. 풀이

from collections import deque

# n : 큐의 크기, m : 뽑아내려는 개수
n, m = map(int, input().split())
# m_list : 뽑으려는 수 리스트
m_list = list(map(int, input().split()))
# n_deque : 해당 크기의 큐
n_deque = deque([i+1 for i in range(n)])

# cnt : 회전 수
cnt = 0
for i in m_list:
    i_index = n_deque.index(i)
    if i_index <= len(n_deque)-i_index:
        cnt += i_index
        n_deque.rotate(-1 * i_index)
    elif i_index > len(n_deque)-i_index:
        cnt += len(n_deque) - i_index
        n_deque.rotate(len(n_deque) - i_index)
#     print('i_index :', i_index)
    
    n_deque.popleft()
    
print(cnt)

3. 후기

 - 문제의 제목처럼 해당 문제의 풀이는 큐를 회전시키는 방법으로 해결했다. 일단 좌측으로 회전시킬지, 우측으로 회전시킬지 더 적은 회전 수를 찾은 후 회전을 시키는 방식으로 코드를 작성하였다. 기존에 계속해서 큐와 관련된 문제에 사용했던 deque에서 제공하는 함수 중 rotate를 사용하여서 쉽게 해결할 수 있었다.