728x90
파이썬 코딩 테스트에서 자주 사용되는 데큐(deque)에 대해 알아보자.
◽ deque()
- Stack이나 queue처럼 한 방향에서 삽입과 삭제가 일어나는게 아니라 양방향에서 삽입과 삭제가 일어나는 자료구조이다.
- 리스트의 양쪽 끝에서 삽입과 삭제를 모두 허용하는 자료의 구조. 이것은 스택과 큐의 자료 구조를 복합한 형태이다.
- 파이썬에서 list를 사용하는 것과 유사하지만 deque를 사용하는 이유는 시간복잡도 때문이다.
- 리스트에서 0번 인덱스를 삭제한다고 생각해보자. 이때 리스트 내부에서는 0번 인덱스를 제거하고 끝이 아니라 뒤에있는 원소들을 앞으로 하나씩 당겨주는 연산을 더 수행하게된다. 따라서 list의 삭제연산은 O(n)이 걸리는데 반면 deque의 삭제연산은 O(1)이다. 따라서 push, pop이 빈번한 알고리즘의 경우 list보다 deque를 사용하는 것이 효율적이다.
from collections import deque
데큐는 위와 같이 불러올 수 있다.
deque를 사용하면 얻는 장점
- 엄격한 리스트를 만들 수 있다.
- 속도가 리스트에 비해 굉장히 빠르다. List = O(n), deque = O(1)
- 당연하지만 큐작업이 훨씬 편해진다.
1. 큐(QUEUE)에 대한 이해.
큐는 기본적으로 선입 선출 (FIFO : First In First Out)구조이다.
예시로는 다음이 있다.
- 프린터기 : 프린터기는 먼저 인쇄를 누른 것부터 차례대로 작동한다.
- 은행 대기표 : 은행에서는 먼저 대기표를 뽑은 사람부터 차례대로 서비스를 진행한다.
deque 함수는 큐에 제한되어 있는 선입선출 제한을 풀어서, 더 여러곳에 사용할 수 있도록 한 함수이다.
2. deque 사용하기
from collections import deque
data = [1, 2, 3, 4, 5]
d = deque(data)
print(d)
#출력
deque([1, 2, 3, 4, 5])
데큐의 함수 목록은 다음과 같다.
함수 목록:
- append
- appendleft
- clear
- copy
- count
- extend
- extendleft
- index
- insert
- maxlen
- pop
- popleft
- remove
- reverse
- rotate
여기서 눈여겨 볼 함수는 다음과 같다.
- appendleft : 왼쪽에 개체를 추가
- extendleft : 왼쪽에 리스트를 연장
- maxlen : 큐의 길이를 반환
- popleft : 큐의 맨 왼쪽에 있는 개체를 반환
- rotate : 큐를 회전
여기서 로테이트는 처음 접하면 생소할 것이다.
그래서 간단한 예시 2개를 들어보자.
#1
d = deque([1, 2, 3, 4, 5])
print(d)
d.rotate(2)
print(d)
d.rotate(-2)
print(d)
#출력
deque([1, 2, 3, 4, 5])
deque([4, 5, 1, 2, 3])
deque([1, 2, 3, 4, 5])
큐 [1 ,2 ,3 ,4 ,5]가 오른쪽에서 왼쪽 방향으로 2 회전하여 [4, 5, 1, 2, 3]이 되었다.
이번에는 반대로 -2로 회전하여 [1 ,2 ,3 ,4 ,5]가 되었다.
#2
from collections import deque
test = [1, 2, 3, 4, 5, 6, 7, 8, 9]
test = deque(test)
test.rotate(2)
result = list(test)
result
[8, 9, 1, 2, 3, 4, 5, 6, 7]
파이썬 알고리즘을 풀다보면 리스트를 회전하는 문제에 많이 직면하게 된다.
이는 python collection 모듈의 deque 자료형을 사용하면된다.
함수안에 음수 를 넣게 된다면 왼쪽회전 양수는 오른쪽회전이다.
728x90
'Python' 카테고리의 다른 글
[Python] - 파이썬 진수변환(2진법, 3진법, 5진법, 10진법).. [n진법] (0) | 2023.02.02 |
---|---|
[Python] - 파이썬 리스트 슬라이싱 (0) | 2023.01.29 |
[python] 삼항연산자 ( if-else 삼항표현식 ) - if 조건식을 한줄로 표현 (0) | 2023.01.29 |
[python] count( ) 문자열의 개수, 리스트의 개수 세는 함수 (1) | 2023.01.29 |
[python] 리스트에 map 사용하기 (0) | 2023.01.29 |