알고리즘

<백준> 7662번 파이썬 알고리즘 [최소,최대 힙]

changha. 2021. 11. 2. 22:41
import sys
import heapq

T = int(sys.stdin.readline())
result = []

for i in range(T):
  max_arr = []
  min_arr = []
  visit = [False] * 1_000_001
  K = int(sys.stdin.readline())
  count = 0
  for i in range(K):
    S, num = sys.stdin.readline().split()

    if S == "I":
      # 튜플의 첫번째로 인해 우선순위 바뀜 
      heapq.heappush(max_arr, (-int(num), i))
      heapq.heappush(min_arr, (int(num), i))
      # True == 아직 지워지지 않음 
      visit[i] = True 
    else:
      if int(num) == -1:
        # 상대힙에서 버린 것 처리 
        while min_arr and not visit[min_arr[0][1]]:
          heapq.heappop(min_arr)
        if min_arr:
          visit[min_arr[0][1]] = False
          heapq.heappop(min_arr)

      elif int(num) == 1:

        while max_arr and not visit[max_arr[0][1]]:
          heapq.heappop(max_arr)
        if max_arr:
          visit[max_arr[0][1]] = False
          heapq.heappop(max_arr)
  
  # 만약 마지막 2번 돌린 연산이 max_arr만 했다면 min_arr 에서 갱신을 해줘야 하므로 
  while min_arr and not visit[min_arr[0][1]]:
    heapq.heappop(min_arr)
  while max_arr and not visit[max_arr[0][1]]:
    heapq.heappop(max_arr)
  if min_arr and max_arr:
    print(-max_arr[0][0], min_arr[0][0])
  else:
    print('EMPTY')

처음 이해하는데 좀 걸렸는데 

코드만 좀 길뿐이지 이해하는데 쉬웠다