IT/ps
백준 7662 이중 우선순위 큐
u149_cinderella
2025. 2. 17. 19:12
max힙과 min힙을 둘다 적절히 사용해주면 될것같다.
import sys
import heapq
t=int(sys.stdin.readline().rstrip())
for _ in range(t):
n=int(sys.stdin.readline().rstrip())
max_h=[]
min_h=[]
size=0
for i in range(n):
opcode,num=sys.stdin.readline().rstrip().split()
num=int(num)
if opcode=='I':
heapq.heappush(min_h,num)
heapq.heappush(max_h,-1*num)
size+=1
else:
if size==0:
continue
size-=1
if num==1:
heapq.heappop(max_h)
else:
heapq.heappop(min_h)
if size==0:
print("EMPTY")
else:
print(-1*max_h[0],min_h[0])
이렇게 작성했다.
size가 0이 될때 모든 힙을 비워줘야한다.
분명 설계할때는 생각을 했었는데 왜 코드구현할때 맨날 디테일을 깜빡하는걸까
import sys
import heapq
t=int(sys.stdin.readline().rstrip())
for _ in range(t):
n=int(sys.stdin.readline().rstrip())
max_h=[]
min_h=[]
size=0
for i in range(n):
opcode,num=sys.stdin.readline().rstrip().split()
num=int(num)
if opcode=='I':
heapq.heappush(min_h,num)
heapq.heappush(max_h,-1*num)
size+=1
else:
if size==0:
min_h=[]
max_h=[]
continue
size-=1
if num==1:
heapq.heappop(max_h)
else:
heapq.heappop(min_h)
if size==0:
print("EMPTY")
else:
print(-1*max_h[0],min_h[0])
이렇게 수정했다.
뭐지
0이 되는 그순간에 힙을 초기화 해야한다.
import sys
import heapq
t=int(sys.stdin.readline().rstrip())
for _ in range(t):
n=int(sys.stdin.readline().rstrip())
max_h=[]
min_h=[]
size=0
for i in range(n):
opcode,num=sys.stdin.readline().rstrip().split()
num=int(num)
if opcode=='I':
heapq.heappush(min_h,num)
heapq.heappush(max_h,-1*num)
size+=1
else:
size-=1
if size<=0:
min_h=[]
max_h=[]
size=0
continue
if num==1:
heapq.heappop(max_h)
else:
heapq.heappop(min_h)
if size==0:
print("EMPTY")
else:
print(-1*max_h[0],min_h[0])
이것도 아니다.
도저히 모르겠어서 질문게시판을 좀 뒤져봤더니
반례를 찾았다.
40에 40이 나와야하는데 다르게 나온다
min힙에서 데이터를 삭제하지 않아서 발생한문제다.
고민을 좀해봐도 도저히 모르겠어서 gpt한테 접근법을 물어봤다.
하...
생각해보면 간단한건데 왜 생각을 못했을까.
import sys
import heapq
t=int(sys.stdin.readline().rstrip())
for _ in range(t):
n=int(sys.stdin.readline().rstrip())
max_h=[]
min_h=[]
dic={}
size=0
for i in range(n):
opcode,num=sys.stdin.readline().rstrip().split()
num=int(num)
if opcode=='I':
heapq.heappush(min_h,num)
heapq.heappush(max_h,num*-1)
if num in dic:
dic[num]+=1
else:
dic[num]=1
else:
if num==1:
while len(max_h)!=0 and dic[(max_h[0])*-1]==0:
heapq.heappop(max_h)
if len(max_h)>0:
dic[(heapq.heappop(max_h))*-1]-=1
else:
while len(min_h)!=0 and dic[min_h[0]]==0:
heapq.heappop(min_h)
if len(min_h)>0:
dic[heapq.heappop(min_h)]-=1
if len(min_h)<1 or len(max_h)<1:
print("EMPTY")
else:
print(max_h[0]*-1,min_h[0])
이렇게 수정해줬다.
..
import sys
import heapq
t=int(sys.stdin.readline().rstrip())
for _ in range(t):
n=int(sys.stdin.readline().rstrip())
max_h=[]
min_h=[]
dic={}
size=0
for i in range(n):
opcode,num=sys.stdin.readline().rstrip().split()
num=int(num)
if opcode=='I':
heapq.heappush(min_h,num)
heapq.heappush(max_h,num*-1)
if num in dic:
dic[num]+=1
else:
dic[num]=1
else:
if num==1:
while len(max_h)!=0 and dic[(max_h[0])*-1]==0:
heapq.heappop(max_h)
if len(max_h)>0:
dic[(heapq.heappop(max_h))*-1]-=1
else:
while len(min_h)!=0 and dic[min_h[0]]==0:
heapq.heappop(min_h)
if len(min_h)>0:
dic[heapq.heappop(min_h)]-=1
while len(max_h)!=0 and dic[(max_h[0])*-1]==0:
heapq.heappop(max_h)
while len(min_h)!=0 and dic[min_h[0]]==0:
heapq.heappop(min_h)
if len(min_h)<1 or len(max_h)<1:
print("EMPTY")
else:
print(max_h[0]*-1,min_h[0])
코드 마지막에 값이 유효한지 확인하는 코드를 추가했다.
진짜 헷갈린다.