시간초과 문제로 열받다가
5트만에 성공..
deque()를 이용해야 하기도 했고,
sys.stdin.readline()이 절박하게 필요한 문제였다.
deque()에 대해서 좀 공부해보아야겠다.
iterable한 데이터로 초기화된 새 deque객체를 반환하는 collections 모듈 내 class로, 스택과 큐를 일반화한 형태라고 한다. 발음은 '디큐'가 아니라 [ 덱(deck) ] 으로 발음한다. double-ended queue의 약자로서 deque라고 이름 지었다고 한다.
기존의 list가 아닌, deque를 사용해야 하는 이유로
Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the same O(1) performance in either direction.
라고 말하고 있다. deque의 양쪽에서 append되고 pop되는 것에 있어 메모리 효율이 높다는 의미라고 읽히는데, 거의 O(1)의 시간복잡도를 보인다는 면에서 기존의 list에서 pop(0)을 했을 때 마지막 요소가 빠지고 앞쪽으로 땡겨져 O(n)의 시간복잡도를 추가로 가지는 단점을 극복할 수 있겠다.
list에는 없는 메서드로, 말그대로 맨 앞쪽 인덱스에 요소를 append해준다.
list의 길이를 0으로(remove all elements)
shallow copy(얕은 복사)를 해준다고 한다.
얕은 복사는 객체의 주소를 복사한다. (종속적)
x와 같은 값을 갖는 요소의 개수를 세어준다.
오른쪽에 iterable을 appending해준다.
말그대로 iterable을 왼쪽에 appending 해준다는 의미이다.
deque 내 x 값을 갖는 index를 반환한다. (가장 첫번째로 마주치는 요소의 index를 반환하거나 없을 경우, ValueError를 반환)
i 위치에 x를 Insert한다.
만약 deque의 maxlen을 넘었을 경우에는 IndexError를 반환한다.
말그대로 pop()
내가 유용하게 사용한 가장 왼쪽의 요소를 pop해주는 메서드.
queue를 구현할 때 필수적인 메서드이다.
value를 값으로 갖는 첫번째 값을 없앤다.
deque를 거꾸로 배열한다.
deque를 n step만큼 오른쪽으로 민다(회전). n이 음수일땐 왼쪽으로 rotate.
deque의 최대 크기
maxlen을 설정할 수 있다
from queue import deque
num_deque = deque([1,2,3], 3)
print(num_deque)
>>> deque([1, 2, 3], maxlen=3)
import sys
from collections import deque
n = int(sys.stdin.readline())
num_queue = deque([])
for i in range(n):
input_str = sys.stdin.readline()
if "push" in input_str:
num_queue.append(int(input_str.lstrip('push ')))
elif "pop" in input_str:
if len(num_queue)>0:
print(num_queue.popleft())
else: print(-1)
elif "size" in input_str:
print(len(num_queue))
elif "empty" in input_str:
if len(num_queue)>0:
print(0)
else: print(1)
elif "front" in input_str:
if len(num_queue)>0:
print(num_queue[0])
else: print(-1)
elif "back" in input_str:
if len(num_queue)>0:
print(num_queue[-1])
else: print(-1)