Algorithm/백준

[백준/Python] 회전하는 큐

poppy 2021. 11. 3. 12:03
반응형

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

 

1021번: 회전하는 큐

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

www.acmicpc.net

from collections import deque

n, m = map(int, input().split())
value = list(map(int, input().split()))
deque = deque([i+1 for i in range(n)])
count = 0 # 2, 3번 연산의 최소 횟수

for v in value:
	if v == deque[0]: # 찾는 수와 첫번째 값이 같다면 값 뽑기
		deque.popleft()
		continue

	idx = deque.index(v) # 찾는 수의 위치
	if idx > len(deque) // 2: # 뒤에서 앞으로 옮기는 것이 효율적인 경우 -> 오른쪽 이동
		deque.rotate(len(deque) - idx)
		count += (len(deque) - idx)
	else: # 앞에서 뒤로 옮기는 것이 효율적인 경우 -> 왼쪽 이동
		deque.rotate(-idx)
		count += idx
	deque.popleft() # 이동이 끝나면 값 뽑기

print(count)

큐를 사용하는 문제이지만 deque의 rotate 함수를 사용하기 위해 deque을 사용해서 문제를 풀었다.

 

1. n까지의 숫자를 담은 덱을 생성한다.

2. 찾으려는 숫자를 찾고 2, 3번 연산의 최소 횟수를 계산한다.

    2-1. 찾는 수(v) == deque의 첫번째 값(deque[0]) 라면 숫자를 뽑고 다음 찾는 수로 넘어간다.

    2-2. 위의 조건에서 같지 않다면 찾는 수의 위치를 구한다.

    2-3. 찾는 수의 위치가 전체 길이의 절반보다 길다면 뒤에서 앞으로 옮기는 것이 효율적이다. -> 따라서 len(deque) - idx 만큼 오른쪽으로 이동

    2-4. 찾는 수의 위치가 전체 길이의 절반보다 짧다면 앞에서 뒤로 옮기는 것이 효율적이다. -> 따라서 idx만큼 왼쪽으로 이동

    2-5. 이동한 만큼 count에 값을 추가한다. 

    2-6. 이동이 끝나면 값을 뽑는다.

3. 결과를 출력한다.

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준/Python] 1로 만들기  (0) 2021.11.10
[백준/Python] 포도주 시식  (0) 2021.11.07
[백준/Python] 시리얼 번호  (0) 2021.10.31
[백준/Python] 절대값 힙  (0) 2021.10.23
[백준/Python] 카드  (0) 2021.10.13