본문 바로가기

코딩테스트/Python

[Python] 백준 #1021 - 회전하는 큐

문제


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())
arr_ = deque(map(int,input().split())) #1
arr = deque([i+1 for i in range(n)]) #2
cnt=0
while arr_:
    x = arr.index(arr_[0]) #3
    if x<=len(arr)//2: #4
        arr.rotate(-x) #5
        cnt+=x
    else: #6
        arr.rotate(len(arr)-x)
        cnt+=len(arr)-x
    arr.popleft() #7
    arr_.popleft() #8
print(cnt)

찾는 숫자가 큐의 앞쪽에 있는지 뒤쪽에 있는지 판별하면서 풀었다.

 

  1. arr_ 은 뽑아야하는 숫자 리스트
  2. arr 은 1~n까지의 수
  3. arr_[0]의 위치를 찾아준다. (x 에 저장)
  4. 문제의 2번방법과 3번방법 중 사용해야하는 방법을 찾아야한다. arr의 중간을 기준으로 앞에 있으면 2번방법, 뒤에 있으면 3번방법을 사용해야한다. if 문이 중간보다 작을때이므로 2번 방법이다. 
  5. 중간보다 작을때는 x만큼 뒤로 보내줘야한다. rotate(-x)를 사용해준다. cnt에 x만큼 더해준다.
  6. 중간보다 클때는 x만큼 앞으로 보내줘야한다. rotate(len(arr)-x)를 사용해준다.
  7. arr의 첫번째 숫자를 pop해준다 (1번방법)
  8. arr_[0] 을 구했으니 pop해준다.