본문 바로가기
Algorithm/스택&큐&덱&힙

[백준] 1021번 회전하는 큐

by HANNI하니 2023. 1. 22.

사용 언어 - Python3

10866번: 덱 (실버4, 큐)

문제 ★큐 문제

 

1021번: 회전하는 큐

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

www.acmicpc.net

 

 

정답

deque([]) 사용하기

(코드 풀이)

<1번 연산>

위치값이 큐의 첫번째 원소와 같으면 큐 앞에 있는 원소를 pop한다.

<2번 연산>

q의 i번째 위치값 < q 길이의 절반 인 경우,

맨 왼쪽의 원소를 q의 맨 뒤로 append한다. q의 첫번째 원소가 i가 될때까지 반복한다.

<3번 연산>

q의 i번째 위치값 > q 길이의 절반 인 경우,

맨 오른쪽의 원소를 q의 맨 앞으로 appendleft 한다. q의 첫번째 원소가 i가 될때까지 반복한다.

 

2,3번 연산을 할 때만 count += 1로 count값을 센다.

 

# 정답

import sys
from collections import deque
input = sys.stdin.readline

n, m = map(int,input().split()) #큐의 크기 n , 뽑아내려는 개수 m
loc = list(map(int,input().split())) #뽑으려는 위치값
q = deque([ _ for _ in range(1,n+1)]) #1~n 큐

count = 0
for i in loc:
    while True:
        if q[0] == i: #가장 최소위치가 가장 앞이라면 앞에 있는 원소 다 삭제
            q.popleft()
            break
        else:
            if q.index(i) < len(q)/2: #q의 i번째 위치 < q 길이의 절반
                while q[0] != i: #q의 첫번째 원소가 i가 될때까지 반복
                    q.append(q.popleft()) # 맨왼쪽 원소를 맨 뒤로 보내기
                    count += 1
            else:
                while q[0] != i :
                    q.appendleft(q.pop()) # 맨오른쪽 원소를 맨 앞으로 보내기
                    count += 1
print(count)

 


레퍼런스

  • 정답 참고
 

[Algorithm] 백준 1021번 회전하는 큐(파이썬)

백준 1021 회전하는 큐 문제풀이

velog.io

  • 깃허브 정답
 

GitHub - yyeongeun/codingtest: 코딩테스트 공부

코딩테스트 공부. Contribute to yyeongeun/codingtest development by creating an account on GitHub.

github.com

 

 

'Algorithm > 스택&큐&덱&힙' 카테고리의 다른 글

[프로그래머스 lv 1] 같은 숫자는 싫어  (0) 2023.01.25
[백준] 5430번 AC  (1) 2023.01.22
[백준] 10866번 덱  (1) 2023.01.22
[백준] 1966번 프린터 큐  (0) 2023.01.22
[백준] 11866번 요세푸스 문제0  (1) 2023.01.22

댓글