큐와 스택은 자료구조의 기본이라고 볼 수 있는데 파이썬에서는 이를 어떻게 구현하면 좋을까!
사실 파이썬은 워낙 리스트와 인덱싱이 편리하게 되어 있어서 리스트만으로도 구현할 수는 있다.
lst.pop(0) # 가장 왼쪽의 요소를 꺼내준다. (queue에서의 dequeue)
lst.pop() # 가장 오른쪽의 요소를 꺼내준다. (stack에서의 pop)
하지만 위처럼 구현했을 때 가장 큰 문제점은 너무 느리다는 것이다.
그래서 효율성 검사 같이 시간제한이 있는 문제에서는 일반적으로 list와 pop 조합 대신에 deque를 사용한다.
from collections import deque
사실 deque 사용법은 엄청 간단하다. list와 큰 차이가 없다!
from collections import deque
queue = [1,2,3]
queue = deque(queue)
queue.append(4)
queue.appendleft(0)
queue.popleft()
queue.popright()
위의 코드는 무슨 흐름이 있는 것은 아니고, 그냥 자주 쓰는 함수들을 적어보았다.
일단, deque를 import하고 파이썬에서 리스트를 생성하듯이 생성한다. 추가로 설치해야하는 패키지가 아니라 코테에서도 유용하게 사용할 수 있다ㅎㅎ. 생성된 리스트를 deque로 감싸주기만 하면 deque가 제공하는 다양한 함수를 사용할 수 있다.
파이썬의 list처럼, 똑같이 [code]append[/code]함수를 지원하는데 list의 append와 동일한 역할을 한다. deque는 [code]appendleft[/code]도 지원을 하는데, 이는 가장 왼쪽에 요소를 추가해주는 함수이다. [code]queue.appendleft(0)[/code] 까지 코드가 진행되면 아마 queue 안에는 [code]deque()[0, 2, 3, 4][/code] 가 존재할 것이다.
[code]popleft()[/code], [code]popright()[/code]은 이름에서 알 수 있듯이 각각 가장 왼쪽에 있는 요소와 가장 오른쪽에 있는 요소를 꺼내준다. 위의 코드에서는 return 값을 안 적어놨지만, 만약 [code]queue.popleft()[/code] 대신 [code]a = queue.popleft()[/code]로 코드를 작성했다면 [code]a[/code]에는 0이 저장되어 있을 것이다.