백준1021(파이썬) - 회전하는 큐

resilient

·

2021. 7. 9. 11:31

728x90
반응형

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

 

1021번: 회전하는 큐

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

www.acmicpc.net

  • 이 문제를 읽고 처음 든 생각은 '문제이름도 큐 니까 큐로 풀어야지' 라고 생각해서 리스트를 사용해서 풀었다.
  • 먼저 q라는 리스트안에 1~n+1까지의 숫자를 넣어준다.
  • for문을 만들어주고, m만 큼 반복해준다. 그 다음부터는 data[i]인덱스와 q리스트 전체 길이를 비교해서 조건문을 만들어주고, data[i] 인덱스가 q리스트 전체 길이 - data[i] 인덱스보다 작을경우, 비교하려는 숫자 data[i]가 q리스트 맨앞에 있으면 q[0]를 삭제해주고, 아니면 , q[0]에 있던 숫자를 리스트 끝에 넣어주고 q[0]을 삭제한다.
import sys

input = sys.stdin.readline

n,m = map(int,input().split())
data = 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)
    now_idx = q.index(data[i])
    if now_idx < q_len - now_idx:
        while 1:
            if q[0] == data[i]:
                del q[0]
                break
            else:
                q.append(q[0])
                del q[0]
                cnt += 1
    else:
        while 1:
            if q[0] == data[i]:
                del q[0]
                break
            else:
                q.insert(0, q[-1])
                del q[-1]
                cnt += 1
print(cnt)
반응형