πŸ—οΈ Algorithm/🟩 λ°±μ€€

🟩 [λ°±μ€€] [Python] [Gold4] 7662번_이쀑 μš°μ„ μˆœμœ„ 큐

Dbswnstjd 2023. 4. 20. 10:42

문제

https://www.acmicpc.net/problem/7662

 

7662번: 이쀑 μš°μ„ μˆœμœ„ 큐

μž…λ ₯ λ°μ΄ν„°λŠ” ν‘œμ€€μž…λ ₯을 μ‚¬μš©ν•œλ‹€. μž…λ ₯은 T개의 ν…ŒμŠ€νŠΈ λ°μ΄ν„°λ‘œ κ΅¬μ„±λœλ‹€. μž…λ ₯의 첫 번째 μ€„μ—λŠ” μž…λ ₯ λ°μ΄ν„°μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ Tκ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ λ°μ΄ν„°μ˜ 첫째 μ€„μ—λŠ” Q에 적

www.acmicpc.net

풀이

# λ°±μ€€ 7662번 문제 - 이쀑 μš°μ„ μˆœμœ„ 큐
import sys
import heapq
input = sys.stdin.readline


test = int(input())
for _ in range(test):
    max_heap, min_heap = [], []
    visit = [0] * 1_000_001

    n = int(input())

    for i in range(n):
        cmd = input().split()
        if cmd[0] == 'I':
            heapq.heappush(min_heap, (int(cmd[1]), i))
            heapq.heappush(max_heap, (int(cmd[1]) * -1, i))
            visit[i] = 1 #True이면 μ–΄λ–€ νž™μ—μ„œλ„ 아직 μ‚­μ œλ˜μ§€ μ•Šμ€ μƒνƒœ

        elif cmd[0] == 'D':
            if cmd[1] == '-1': #μ‚­μ œμ—°μ‚°μ‹œ, key값을 κΈ°μ€€μœΌλ‘œ ν•΄λ‹Ή λ…Έλ“œκ°€ λ‹€λ₯Ένž™μ—μ„œ μ‚­μ œλœ λ…Έλ“œμΈκ°€λ₯Ό λ¨Όμ € νŒλ‹¨ν•œλ‹€.
                # 이미 μƒλŒ€νž™μ— μ˜ν•΄ μ‚­μ œλœ λ…Έλ“œμΈκ²½μš° μ‚­μ œλ˜μ§€ μ•Šμ€ λ…Έλ“œκ°€ λ‚˜μ˜¬λ•ŒκΉŒμ§€ 계쏙 버리닀가 이후 μ‚­μ œλŒ€μƒλ…Έλ“œκ°€ λ‚˜μ˜€λ©΄ μ‚­μ œν•œλ‹€.
                while min_heap and not visit[min_heap[0][1]]: # visit이 False일떄 -> ν•΄λ‹Ήλ…Έλ“œκ°€ μ‚­μ œλœμƒνƒœ
                    heapq.heappop(min_heap) # 버림 (μƒλŒ€νž™μ—μ„œ 이미 μ‚­μ œλœλ…Έλ“œμ΄λ―€λ‘œ)
                if min_heap:
                    visit[min_heap[0][1]] = 0 # visit이 Tureμ—ΏμœΌλ―€λ‘œ False둜 λ°”κΎΈκ³  λ‚΄κ°€ μ‚­μ œν•¨
                    heapq.heappop(min_heap)
            elif cmd[1] == '1':
                while max_heap and not visit[max_heap[0][1]]: #이미 μ‚­μ œλœ λ…Έλ“œμΈκ²½μš° μ‚­μ œλ˜μ§€ μ•Šμ€ λ…Έλ“œκ°€ λ‚˜μ˜¬λ•ŒκΉŒμ§€ λͺ¨λ‘ 버린닀.
                    heapq.heappop(max_heap)
                if max_heap:
                    visit[max_heap[0][1]] = 0
                    heapq.heappop(max_heap)

    while min_heap and not visit[min_heap[0][1]]:
        heapq.heappop(min_heap)
    while max_heap and not visit[max_heap[0][1]]:
        heapq.heappop(max_heap)

    if min_heap and max_heap:
        print(-max_heap[0][0], min_heap[0][0])
    else:
        print('EMPTY')