백준 1021번 문제 바로가기

deque을 이용한 풀이

deque(덱)을 이용해서 문제를 해결했다. deque는 일명 양방향 queue인데 queue.pop(0)으로도 맨 앞의 요소를 꺼낼 수 있지만 그보다는 deque.popleft()을 사용하는 편이 시간 소요가 적다.(더 직관적이기도 하고) 어떤 방향(오른쪽/왼쪽)으로 회전하는 것이 더 유리한지 판단하는 것만 잘 고려해주면 비교적 쉽게 해결 가능했다.

# 입력
import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())
arr = map(int, sys.stdin.readline().split())
count = 0
queue = deque([i+1 for i in range(n)])

# 처리
for i in arr:
    if queue[0] == i:
        queue.popleft()
    else:
        from_left = queue.index(i)
        from_right = len(queue) - queue.index(i) - 1

        if from_left <= from_right:
            for _ in range(from_left):
                queue.append(queue.popleft())
            count += from_left
            queue.popleft()
        else:
            for _ in range(from_right):
                queue.appendleft(queue.pop())
            count += from_right + 1
            queue.pop()
            
print(count)