Algorithm(알고리즘)/백준
30_백준 1021번 파이썬 회전하는 큐
반응형
큐,디큐 queue의 deque 를 사용하는 문제이다.
deque의 명령어 및 자세한 사용법은 따로 정리하였다.
문제를 잘 읽고 조건을 잘 짜는게 해결의 포인트다.
먼저 문제를 이해 해야하는데
연산 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)
반응형
'Algorithm(알고리즘) > 백준' 카테고리의 다른 글
31_백준 18258번 파이썬 큐2 (0) | 2021.06.22 |
---|---|
29_백준 1874번 파이썬 스택수열 (0) | 2021.06.22 |
28_백준 4949번 파이썬 균형잡힌세상 (0) | 2021.06.22 |
27_백준 1010번 파이썬 다리놓기 (0) | 2021.06.22 |
26_백준 11050번 파이썬 이항계수 (0) | 2021.06.22 |
댓글