class MinMaxTracker:
def __init__(self):
self.data = deque() # 실제 데이터를 저장하는 데큐
self.max_deque = deque() # 현재 배열에서 최댓값을 관리하는 데큐
self.min_deque = deque() # 현재 배열에서 최솟값을 관리하는 데큐
def append(self, value):
self.data.append(value)
# 최댓값 갱신 로직:
# 새 값보다 작은 값들은 max_deque에서 제거 (이 값들은 더 이상 최댓값 후보가 될 수 없음).
while self.max_deque and self.max_deque[-1] < value:
self.max_deque.pop()
self.max_deque.append(value)
# 최솟값 갱신 로직:
# 새 값보다 큰 값들은 min_deque에서 제거 (이 값들은 더 이상 최솟값 후보가 될 수 없음).
while self.min_deque and self.min_deque[-1] > value:
self.min_deque.pop()
self.min_deque.append(value)
def popleft(self):
if not self.data:
return -1 # 비어 있는 경우 -1 반환
value = self.data.popleft()
# 제거된 값이 현재 최댓값이면 max_deque에서도 제거
if self.max_deque[0] == value:
self.max_deque.popleft()
# 제거된 값이 현재 최솟값이면 min_deque에서도 제거
if self.min_deque[0] == value:
self.min_deque.popleft()
def get_max(self):
# 현재 최댓값을 반환. 비어 있는 경우 -1 반환
if not self.max_deque:
return -1
return self.max_deque[0]
def get_min(self):
# 현재 최솟값을 반환. 비어 있는 경우 -1 반환
if not self.min_deque:
return -1
return self.min_deque[0]