티스토리 뷰

PS/BOJ Python

1021번 - 회전하는 큐

zpqmdh 2023. 4. 4. 15:50

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

 

1021번: 회전하는 큐

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

www.acmicpc.net

요즘 자료구조 문제를 많이 푸는 것 같다. 이 문제는 회전하는 큐를 덱으로 구현하는 문제이다.

idx라는 변수를 두어 answer에 넣어야 하는 수가 무엇인지 검사하였다. (입력의 num 배열로)

만약 아니라면, 1번 연산을 다시 되돌리고 찾고자 하는 수의 위치를 찾는다.

인덱스가 앞쪽이면 2번 연산을, 뒤쪽이면 3번 연산을 수행한다.

이때 인덱스 비교를 할 때 // 대신 / 를 써야 한다.

Q의 길이가 홀수일 때 앞쪽에 두는 게 더 빠르기 때문이다.

예를 들어, [1, 2, 3, 4, 5] 가 있고 3을 찾고자 하면 앞쪽은 [1, 2, 3]이고 뒤쪽은 [4, 5]이다.

그러고 3번을 앞으로 뽑으면 2번의 연산을 하면 되지만 / 뒤로 뽑으면 3번의 연산을 해야 한다.

따라서 Q의 길이가 홀수일 때 실수형으로 나오게 하면, 중간값이 앞쪽에 속하게 된다.

# 회전하는 큐
import sys
input = sys.stdin.readline
from collections import deque

N, M = map(int, input().split())
num = list(map(int, input().split()))
answer = []
cnt = 0
Q = deque([i for i in range(1, N+1)])

while True:
    if answer == num:
        print(cnt)
        break
    idx = len(answer)
    while True:
        q = Q.popleft() # 1
        if q == num[idx]:
            answer.append(q)
            break
        else:
            Q.appendleft(q) # 원래대로
            if Q.index(num[idx]) < len(Q) / 2:
                Q.append(Q.popleft()) # 2
                cnt += 1
            else:
                Q.appendleft(Q.pop()) # 3
                cnt += 1

'PS > BOJ Python' 카테고리의 다른 글

2003번 - 수들의 합 2  (0) 2023.04.23
3036번 - 링  (0) 2023.04.05
10816번 - 숫자 카드 2  (0) 2023.04.03
1158번 - 요세푸스 문제  (0) 2023.04.03
1759번 - 암호 만들기  (0) 2023.04.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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 27 28 29 30
글 보관함