Algorithm(알고리즘)/백준

30_백준 1021번 파이썬 회전하는 큐

고로케 2021. 6. 22.
반응형

큐,디큐 queue의 deque 를 사용하는 문제이다.
deque의 명령어 및 자세한 사용법은 따로 정리하였다.

deque 명령어 및 사용법 총정리

 

[자료구조] 파이썬 큐(Queue), deque 사용법 총정리

큐(Queue) : 한쪽 끝으로 자료를 넣고, 반대쪽에서는 자료를 뺄 수 있는 선형구조. 이런 자료 구조를 First In First Out 이라고 해서 FIFO 라고 부른다. 선입선출 파이썬 큐(Queue), deque 사용법! 1. deque 만들

gorokke.tistory.com

 

 

문제를 잘 읽고 조건을 잘 짜는게 해결의 포인트다.
먼저 문제를 이해 해야하는데
연산 1번 2번 3번으로 나눠져있고
원하는 출력값은 2번 3번연산이 몇번 실행 되었는지 카운트 하여 최소 연산횟수를 출력해주면 된다.
1번연산은 스택의 맨 왼쪽 (첫 항)이랑 원하는 숫자가 같으면 popleft()를 한다.
2번연산은 스택의 맨 왼쪽을 popleft() 하여 .append()로 맨 뒤에 붙여준다.
3번연산은 스택의 맨 오른쪽을 pop() 하여 .appendleft()로 맨 앞에 붙여준다.

2번,3번 연산은 실행 될때마다 카운트하면 되는 문제.

아래 풀이는 함수를 이용하였다.

 

  • 풀이
from sys import stdin
from collections import deque


def pop_left():  # 1번 연산
    return stack.popleft()


def move_left():  # 2번 연산
    temp = stack.popleft()
    stack.append(temp)
    return


def move_right():  # 3번 연산
    temp = stack.pop()
    stack.appendleft(temp)
    return


# 큐의 크기 N , 뽑아 내려고 하는 수의 개수 M
# 뽑아내려는 숫자 num
N, M = map(int, stdin.readline().split())
stack = deque(range(1, N + 1))

num_list = deque()
num_list = list(map(int, stdin.readline().split()))

count = 0
for i in num_list:
    num_index = stack.index(i)
    if i == stack[0]:
        pop_left()
        continue

    if num_index < len(stack) / 2:
        while True:
            if i == stack[0]:
                pop_left()
                break
            move_left()
            count += 1

    else:
        while True:
            if i == stack[0]:
                pop_left()
                break
            move_right()
            count += 1

print(count)

 

반응형

댓글