Algorithm/Data Structure
(Python) - BOJ(1021번) : 회전하는 큐
하눤석
2022. 1. 24. 12:44
728x90
https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가
www.acmicpc.net
- 해설 :
크기가 N인 큐에서 M개의 수를 뽑아내려고 한다. 뽑아내는 연산은 0번째 원소만 가능할 때, 큐를 왼쪽, 또는 오른쪽으로 한 칸씩 회전시키는 연산을 최소 몇 번 하여 뽑아내려는 값을 전부 뽑아낼 수 있는지 찾는 문제이다.
- 풀이 :
자료구조중 덱을 사용하여 구현하면 효율적으로 구현이 가능하다.
스택, 큐, 덱의 차이점은 아래 링크에 정리해 두었다.
(스택, 큐, 덱이란? : https://recordofwonseok.tistory.com/81?category=1002112)
왼쪽으로 회전시킬지 오른쪽으로 회전시킬지에 대한 판단은 중앙을 기준으로 왼쪽에 찾으려는 요소가 있는지 오른쪽에 있는지를 판단하여 결정해주었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
n, m = map(int, input().split())
s = list(map(int ,input().split()))
q = [i for i in range(1, n + 1)]
cnt = 0
for i in range(m):
q_len = len(q)
q_index = q.index(s[i])
if q_index < q_len - q_index:
while True:
if q[0] == s[i]:
del q[0]
break
else:
q.append(q[0])
del q[0]
cnt += 1
else:
while True:
if q[0] == s[i]:
del q[0]
break
else:
q.insert(0, q[-1])
del q[-1]
cnt += 1
print(cnt)
|
cs |
320x100