https://www.acmicpc.net/problem/7662
시간 6초, 메모리 256MB
input :
output :
조건 :
기말고사 시험의 베이스가 되었던 문제이다.
일단 우선적으로 리스트 2개를 이용해서 max, min 리스트를 만들어 두고 이 값을 업데이트 하는 방향으로 문제를 풀어 나갔다.
값들을 삭제하는 경우에 이미 삭제가 되었는데 다른 리스트에는 남아있는 경우가 발생할 수 있다.
이를 해결 하기위해 cnt 라는 변수를 통해 개수를 저장하고 있게 한다면 어떨까 싶어 이를 이용했다.
그러나 이 경우 중복된 수를 확인 할 수 없다.
그래서 딕셔너리?를 이용해서 풀어볼까 했지만 계속 틀렸습니다.를 받았다.
다른 풀이들을 살펴 보니 위의 방법들도 필요하지만 가장 중요한 것은 리스트 안에서 값을 찾을 때 현재 값이 이미 삭제 되어 있는 값인데도 남아있는 경우를 유의 해야 하는 것이다.
그를 위해 while 문의 조건이 생기게 되고 리스트의 0번째 원소를 꺼내서 확인을 해야 한다.
data 배열이 1백만 까지 있는것은 값이 1백만번 까지 들어올 수 있기 때문이고 idx는 각 원소가 언제 들어왔는 지를 나타낸다.
이 배열을 통해 cnt가 없어도 현재 남아있는 원소의 개수를 알 수 있다.
import sys
from heapq import heappop, heappush
t = int(sys.stdin.readline())
for i in range(t):
max_num = []
min_num = []
data = [0] * 1000000
k = int(sys.stdin.readline())
for j in range(k):
l, n = sys.stdin.readline().split()
n = int(n)
if l == 'I':
heappush(max_num, (-n, j))
heappush(min_num, (n, j))
data[j] = 1
else:
if n == -1:
while min_num and data[min_num[0][1]] == 0:
heappop(min_num)
if min_num:
data[min_num[0][1]] = 0
heappop(min_num)
else:
while max_num and data[max_num[0][1]] == 0:
heappop(max_num)
if max_num:
data[max_num[0][1]] = 0
heappop(max_num)
if sum(data) == 0:
print("EMPTY")
else:
while max_num and data[max_num[0][1]] == 0:
heappop(max_num)
ans_max = -max_num[0][0]
while min_num and data[min_num[0][1]] == 0:
heappop(min_num)
ans_min = min_num[0][0]
print(f"{ans_max} {ans_min}")