덱
from collections import deque
# 데크 생성
deque_list = deque
# 데크의 오른쪽에 원소 추가
deque_list.append1
deque_list.append2
deque_list.append3
# 데크의 왼쪽에 원소 추가
deque_list.appendleft0
# 데크 출력
printdequelist # 출력: deque[0,1,2,3]
# 데크의 오른쪽에서 원소 제거
deque_list.pop
# 데크의 왼쪽에서 원소 제거
deque_list.popleft
# 데크 출력
printdequelist # 출력: deque[1,2]
- 큐
Queue( 구현:)
덱는 양쪽에서 삽입과 삭제가 가능한 큐로 사용될 수 있습니다. 큐는 선입선출 FIFO( 구조를 가지며, 데크를 이용하면 원소를 앞과 뒤에서 빠르게 삽입/삭제할 수 있어서 큐를 효율적으로 구현할 수 있습니다.) - 스택
Stack( 구현:)
덱는 양쪽에서 삽입과 삭제가 가능하므로 스택 Stack( 을 구현하는 데에도 사용될 수 있습니다. 스택은 후입선출) LIFO( 구조를 가지며, 데크의 양쪽에서 pop과 append 메서드를 사용하여 스택을 구현할 수 있습니다.) - 원형 버퍼
Circular Buffer( 구현:)
데크는 최대 길이를 지정할 수 있기 때문에, 원형 버퍼를 구현하는데에도 유용합니다. 원형 버퍼는 고정된 크기를 가진 버퍼로, 새로운 원소가 추가될 때 최근 원소를 덮어쓰는 방식으로 동작합니다. 데크를 이용하여 원형 버퍼를 구현하면 메모리를 효율적으로 관리할 수 있습니다. - 슬라이딩 윈도우
Sliding Window( 문제:)
슬라이딩 윈도우 문제는 주어진 배열에서 특정 크기의 윈도우를 이동시키면서 원하는 연산을 수행하는 문제입니다. 데크를 사용하면 슬라이딩 윈도우 문제를 효율적으로 해결할 수 있습니다. - 중복 원소 관리:
데크는 중복된 원소를 허용하며, 원소들의 순서를 보존합니다. 따라서 중복 원소가 있는 데이터를 관리할 때 유용하게 사용될 수 있습니다.
문제
정수를 저장하는 덱
명령은 총 여덟 가지이다.
- push_front X: 정수 X를 덱의 앞에 넣는다.
- push_back X: 정수 X를 덱의 뒤에 넣는다.
- pop_front: 덱의 가장 앞에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- pop_back: 덱의 가장 뒤에 있는 수를 빼고, 그 수를 출력한다. 만약, 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 덱에 들어있는 정수의 개수를 출력한다.
- empty: 덱이 비어있으면 1을, 아니면 0을 출력한다.
- front: 덱의 가장 앞에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- back: 덱의 가장 뒤에 있는 정수를 출력한다. 만약 덱에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
import sys
input = sys.stdin.readline
N = int(input())
l = [0] * N
for i in range(N):
l[i] = list(map(str,input().split()))
class Deque:
deque = []
def push_front(self, n):
self.n = n
Deque.deque.insert(0, self.n)
def push_back(self, n):
self.n = n
Deque.deque.append(self.n)
def pop_front(self):
if Deque.deque == []:
print(-1)
else :
print(Deque.deque.pop(0))
def pop_back(self):
if Deque.deque == []:
print(-1)
else :
print(Deque.deque.pop())
def size(self):
print(len(Deque.deque))
def empty(self):
if len(Deque.deque) != 0:
print(0)
else:
print(1)
def front(self):
if len(Deque.deque) == 0:
print(-1)
else:
print(Deque.deque[0])
def back(self):
if len(Deque.deque) == 0:
print(-1)
else:
print(Deque.deque[-1])
for i in range(N):
if len(l[i]) == 2:
getattr(Deque(), l[i][0])(int(l[i][1]))
else:
getattr(Deque(), l[i][0])()
예제 입력 1
15
push_back 1
push_front 2
front
back
size
empty
pop_front
pop_back
pop_front
size
empty
pop_back
push_front 3
empty
front
예제 출력 1
2
1
2
0
2
1
-1
0
1
-1
0
3
예제 입력 2
22
front
back
pop_front
pop_back
push_front 1
front
pop_back
push_back 2
back
pop_front
push_front 10
push_front 333
front
back
pop_back
pop_back
push_back 20
push_back 1234
front
back
pop_back
pop_back
예제 출력 2
-1
-1
-1
-1
1
1
2
2
333
10
10
333
20
1234
1234
20
'IT > Python' 카테고리의 다른 글
[백준] 1475번 방 번호 [Python] 0 | 2023.08.01 |
---|---|
[백준] 10845번 큐 [Python] 0 | 2023.08.01 |
[백준] 10828번 스택 [Python] 0 | 2023.07.31 |
[백준] 2839번 설탕 배달 [Python] 0 | 2023.07.31 |