Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

27-alstjr7437 #198

Merged
merged 2 commits into from
May 29, 2024
Merged

27-alstjr7437 #198

merged 2 commits into from
May 29, 2024

Conversation

alstjr7437
Copy link
Member

@alstjr7437 alstjr7437 commented May 26, 2024

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ

์•„๋‹ˆ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋ฌธ์ œ ์ด๋ฆ„๋ถ€ํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํฌ์ธ๋ฐ์š”?

image

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

1์‹œ๊ฐ„ 30๋ถ„

์•Œ๊ณ ๋ฆฌ์ฆ˜

์šฐ์„ ์ˆœ์œ„ ํ






โŒ ํ‹€๋ฆฐ ์ˆ˜๋„ ์ฝ”๋“œ

  1. heap์œผ๋กœ ๋งŒ๋“ ๋‹ค.
  2. push๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.
  3. pop์ผ ๊ฒฝ์šฐ 1์ด๋ฉด heap์—์„œ heappop์œผ๋กœ ์ œ์ผ ์ž‘์€ ๋ถ€๋ถ„์„ ๋นผ์ค€๋‹ค
  4. pop์ผ ๊ฒฝ์šฐ -1์ด๋ฉด List์—์„œ pop()์œผ๋กœ ์ œ์ผ ํฐ ๋ถ€๋ถ„์„ ๋นผ์ค€๋‹ค.




ํ•˜์ง€๋งŒ Heap.pop()์„ ํ•˜๊ฒŒ ๋˜๋ฉด heap ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)์€ ๋งž์ง€๋งŒ ํž™ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค!!


๊ทธ๋Ÿฐ๋ฐ ์ด์ƒํ•˜๊ฒŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋œจ๋˜๋ฐ ์™œ๊ทธ๋Ÿฌ๋Š”์ง€ ์•„์‹ค๊นŒ์—ฌ...?

from heapq import *

t = int(input())
for _ in range(t):
    heap = []
    q = int(input())

    for _ in range(q):
        k = list(input().split())
        if k[0] == "I" :
            heappush(heap, int(k[1]))
        else :
            if len(heap) == 0:
                continue
            if int(k[1]) == -1:
                heappop(heap)
            else :
                heap.pop()

    if len(heap) == 0 :
        print("EMPTY")
    else :
        print(heap[-1], heap[0])






๐Ÿ…พ๏ธ ์ •๋‹ต ์ˆ˜๋„ ์ฝ”๋“œ

์šฐ์„ ์ ์œผ๋กœ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ max๋ž‘ min heap์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š”๊ฑด ์•Œ์•˜์Šต๋‹ˆ๋‹ค!!
โžก๏ธ Python์—์„œ๋Š” ์ตœ์†Œ Heap๋งŒ ์ง€์›์„ ํ•ด์„œ!!!


์ตœ์†Œ ํž™ (Min-Heap): ๊ธฐ๋ณธ ํž™, ์ตœ์†Œ๊ฐ’ ์ €์žฅ
์ตœ๋Œ€ ํž™ (Max-Heap): ์š”์†Œ ์Œ์ˆ˜ ์ €์žฅ, ์ตœ๋Œ€๊ฐ’ ์ €์žฅ


ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด minheap, maxheap์„ ๋งŒ๋“ค์–ด์„œ
min๊ฐ’์ด ์—†์–ด์ง€๋ฉด Max๋„ ์—†์–ด์ ธ์•ผ ํ•˜๋Š” ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.


์ด๋ถ€๋ถ„์—์„œ ๋งŽ์ด ๋ง‰ํ˜€์„œ ์ธํ„ฐ๋„ท์— ์ฐธ๊ณ ํ•˜๋‹ˆ ์–ด๋–ค ์‚ฌ๋žŒ์€ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋งŒ๋“ค๊ณ 
์–ด๋–ค ์‚ฌ๋žŒ์€ ๋ฐฐ์—ด์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.


์ฒ˜์Œ์—๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ ค ํ–ˆ์ง€๋งŒ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•„์„œ
q๋กœ ๋ฐ›๋Š” ๋ช…๋ น์–ด์˜ ๊ฐœ์ˆ˜ ๋งŒํผ nums๋ผ๋Š” ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์คฌ์Šต๋‹ˆ๋‹ค!!!




๊ทธ๋ž˜์„œ ๋งŒ๋“  ์ฝ”๋“œ๊ฐ€



heap์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„

min_heap์€ ๊ธฐ๋ณธ heap์ด ์ตœ์†Œ ํž™์ด๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ์‚ฝ์ž…ํ•ด์ฃผ๊ณ  ๋’ค์— ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ i๋ผ๋Š” Index๋ฅผ ๋„ฃ์–ด์คฌ์Šต๋‹ˆ๋‹ค.
max_heap์— -๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ์ œ์ผ ํฐ ์ˆ˜๊ฐ€ ๋น ์ง€๋ฏ€๋กœ -iNum์„ ๋„ฃ์–ด์คฌ์Šต๋‹ˆ๋‹ค.

if k[0] == "I" :
    heappush(min_heap, (iNum,i))    # ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ i๋„ ํŠœํ”Œ๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ
    heappush(max_heap, (-iNum, i))
    nums[i] = True









โญ๏ธโญ๏ธโญ๏ธ ์‚ญ์ œ ๋กœ์ง

์ฒ˜์Œ heap ๊ตฌ์กฐ

1 2 3 4 5
10 20 30 40 50

๋“ค์–ด์˜ค๋Š” ๋ช…๋ น์–ด D -1(์ตœ์†Œ), D 1(์ตœ๋Œ€), D -1(์ตœ์†Œ)


์ตœ์†Œ ํž™

1 2 3 4 5 ๋ช…๋ น์–ด
False 20 30 40 50 D -1
False 20 30 40 50(False) D 1
False False 30 40 50(False) D -1

-> 30์ด ๋‚จ๊ฒŒ ๋จ ์ตœ์†Œ ํž™์—


์ตœ๋Œ€ ํž™

1 2 3 4 5 ๋ช…๋ น์–ด
-50 -40 -30 -20 -10(False) D -1
False -40 -30 -20 -10(False) D 1
False -40 -30 -20(False) -10(False) D -1
False -40 -30 -20(False) -10(False) ์ตœ์ข…

-> ์ตœ๋Œ€ ํž™์— 40์ด ๋‚จ๊ฒŒ ๋จ









heap์— ์ตœ๋Œ€๊ฐ’ ์‚ญ์ œํ•˜๋Š” ๋ถ€๋ถ„ - D 1

while๋ฌธ์€ max_heap์ด ๋‚จ์•„์žˆ๊ณ ,
maxheap์˜ ์•ž๋ถ€๋ถ„(์˜ˆ์—์„œ๋Š” 50)์ด ์ด๋ฏธ ๋ฒ„๋ ค์ ธ ์žˆ์œผ๋ฉด pop์œผ๋กœ ๋ฒ„๋ ค๋ฒ„๋ฆฌ๊ธฐ -> ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด์„œ


if ๋ฌธ์€
max_heap์—์„œ ์ž‘์€์ˆ˜ ์ œ๊ฑฐ -> ์ตœ๋Œ€ ํž™์œผ๋กœ ์ œ์ผ ํฐ ์ˆ˜ ๋ฒ„๋ฆฌ๊ธฐ


elif iNum == 1:
    while max_heap and not nums[max_heap[0][1]]:   
        heappop(max_heap)
    if max_heap:     # max_heap์—์„œ ์ž‘์€ ์ˆ˜ ์ œ๊ฑฐ
        nums[max_heap[0][1]] = False 
        heappop(max_heap)






heap์— ์ตœ์†Œ๊ฐ’ ์‚ญ์ œํ•˜๋Š” ๋ถ€๋ถ„ - D -1

์œ„์˜ ์ตœ๋Œ€ํž™๊ณผ ๊ฐ™์€ ๋กœ์ง์œผ๋กœ ๋Œ์•„๊ฐ

else:
    while min_heap and not nums[min_heap[0][1]]:    # ์ด๋ฏธ ์‚ญ์ œ๋œ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋ชจ๋‘ ๋ฒ„๋ฆผ
        heappop(min_heap)
    if min_heap:    # min_heap์—์„œ ์ž‘์€ ์ˆ˜(์‚ญ์ œ ๋…ธ๋“œ) ์ œ๊ฑฐ
        nums[min_heap[0][1]] = False
        heappop(min_heap)






๋ชจ๋“  ์—ฐ์‚ฐ ํ›„ ๋™๊ธฐํ™” ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ฒ˜๋ฆฌ

์œ„์˜ ์‚ญ์ œ ๋กœ์ง๊ณผ ๋˜‘๊ฐ™์ด min, max heap์˜ ์•ž๋ถ€๋ถ„์„ ํ™•์ธํ•˜๊ณ  ๋™๊ธฐํ™”๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด
๋…ธ๋“œ๋“ค์„ ์‚ญ์ œํ•จ

while min_heap and not nums[min_heap[0][1]]:
    heappop(min_heap)
while max_heap and not nums[max_heap[0][1]]:
    heappop(max_heap)






โญ๏ธโญ๏ธโญ๏ธ ๋™๊ธฐํ™”์˜ ์ค‘์š”์„ฑ

์ฒ˜์Œ heap ๊ตฌ์กฐ

1 2 3 4
10 20 30 40

๋“ค์–ด์˜ค๋Š” ๋ช…๋ น์–ด D -1(์ตœ์†Œ), D -1(์ตœ์†Œ), D 1(์ตœ๋Œ€), D 1(์ตœ๋Œ€)


์ตœ์†Œ ํž™

1 2 3 4 ๋ช…๋ น์–ด
False 15 20 30 D -1
False False 20 30 D -1
False False 20(False) 30 D 1
False False 20(False) 30(False) D 1
20(False) 30(False) ์ตœ์ข…
๋™๊ธฐํ™” ํ›„

๋™๊ธฐํ™” while ๋ฌธ ์ฒ˜๋ฆฌ โžก๏ธ heap[0][1]์ด False๋ฉด pop์„ ํ•ด๋ฒ„๋ฆผ โžก๏ธ 2๊ฐœ ๋‹ค ๋น ์ง
Empty๊ฐ€ ๋จ!!!


์ตœ์†Œ ํž™

1 2 3 4 ๋ช…๋ น์–ด
-30 -20 -15 -10(False) D -1
-30 -20 -15(False) -10(False) D -1
False -20 -15(False) -10(False) D 1
False False -15(False) -10(False) D 1
-15(False) -10(False) ์ตœ์ข…
๋™๊ธฐํ™” ํ›„

๏ฟฝ์ตœ๋Œ€ ํž™๊ณผ ๊ฐ™์€ ๋ฐฉ์‹









๐Ÿ’ก ์ตœ์ข… ์ฝ”๋“œ

from heapq import *
import sys

input = sys.stdin.readline

t = int(input())

for _ in range(t):
    q = int(input())

    # ์ตœ์†Œํž™๋งŒ ์ง€์›ํ•ด์„œ ์ตœ๋Œ€, ์ตœ์†Œ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ
    min_heap = []
    max_heap = []
    nums = [False] * q  # ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋ถ€๋ถ„

    for i in range(q):
        k = list(input().split())
        iNum = int(k[1])  

        # ์ž…๋ ฅ ๋ถ€๋ถ„
        if k[0] == "I" :
            heappush(min_heap, (iNum,i))    # ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ i๋„ ํŠœํ”Œ๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ
            heappush(max_heap, (-iNum, i))
            nums[i] = True
        elif iNum == 1:
            while max_heap and not nums[max_heap[0][1]]:   
                heappop(max_heap)
            if max_heap:     # max_heap์—์„œ ์ž‘์€ ์ˆ˜ ์ œ๊ฑฐ
                nums[max_heap[0][1]] = False 
                heappop(max_heap)
        else:
            while min_heap and not nums[min_heap[0][1]]:    # ์ด๋ฏธ ์‚ญ์ œ๋œ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋ชจ๋‘ ๋ฒ„๋ฆผ
                heappop(min_heap)
            if min_heap:    # min_heap์—์„œ ์ž‘์€ ์ˆ˜(์‚ญ์ œ ๋…ธ๋“œ) ์ œ๊ฑฐ
                nums[min_heap[0][1]] = False
                heappop(min_heap)
        # print(min_heap, max_heap, nums, k)
    # ๋ชจ๋“  ์—ฐ์‚ฐ ํ›„ ๋™๊ธฐํ™” ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ฒ˜๋ฆฌ
    while min_heap and not nums[min_heap[0][1]]:
        heappop(min_heap)
    while max_heap and not nums[max_heap[0][1]]:
        heappop(max_heap)

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

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

python์—์„œ heap์€ ์ตœ์†Œํž™๋งŒ ์ง€์›์„ ํ•˜๊ฒŒ ๋˜๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณค ์žˆ์—ˆ์ง€๋งŒ ์ฒด๊ฐํ•˜๋‹ˆ ์ฐธ ์–ด๋ ต๋”๊ตฐ์š”...

๊ทธ๋ž˜๋„ visited ํ˜•ํƒœ๋กœ ๋‘๊ณ  ๋‘๊ฐœ์˜ ํž™์„ ๋™๊ธฐํ™” ํ•˜๋ฉด์„œ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด ์žฌ๋ฐŒ์—ˆ์Šต๋‹ˆ๋‹ค!!

Copy link
Member

@tgyuuAn tgyuuAn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

from heapq import *

t = int(input())
for _ in range(t):
    heap = []
    q = int(input())

    for _ in range(q):
        k = list(input().split())
        if k[0] == "I" :
            heappush(heap, int(k[1]))
        else :
            if len(heap) == 0:
                continue
            if int(k[1]) == -1:
                heappop(heap)
            else :
                heap.pop()

    if len(heap) == 0 :
        print("EMPTY")
    else :
        print(heap[-1], heap[0])

์ด ๋กœ์ง์—์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜๋Š” ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์”๋‹ˆ๋‹ค...

ํ•˜์ง€๋งŒ ์ €๊ธฐ์„œ ์ตœ๋Œ€ ๊ฐ’์„ ๋นผ๋ ค๊ณ  heap.pop()์„ ํ•˜์‹ ๊ฑฐ๋Š” ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์‚ฌ์šฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!!

์ง€๊ธˆ์€ ์ € ๋กœ์ง์ด ์™œ ์ž˜๋ชป๋˜์—ˆ๋Š” ์ง€ ์•„์‹œ๊ฒ ์ฃ  ...?!

์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค๋กœ ์ถœ๋ ฅ๋˜์—ˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.







์ €๋„ ์ด๊ฑฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ˆ˜๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ์˜ ๋™๊ธฐํ™”๋ฅผ ์ƒ๊ฐํ•ด์„œ ์ฒ˜์Œ์—๋Š” ์ง‘ํ•ฉ์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค๊ฐ€,

2๊ฐœ ์ด์ƒ์˜ ์ˆ˜๊ฐ€ ๋“ค์–ด์˜ค๊ณ  ํ•˜๋‚˜์˜ ์ˆ˜๊ฐ€ ๋น ์กŒ์„ ๋•Œ ์ง‘ํ•ฉ์œผ๋กœ ์ €์žฅ๋˜๋ฉด ๊ทธ๋ƒฅ ๋‚จ์•„์žˆ๋Š” ์ˆ˜๋„ ์—†๋Š” ์ˆ˜ ์ทจ๊ธ‰ํ•˜๊ณ  ์ œ๊ฑฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฐ”๊ฟ”์„œ ์ œ์ถœํ–ˆ๋”๋‹ˆ solved ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

from heapq import *
from collections import defaultdict
import sys

def input(): return sys.stdin.readline().rstrip()

T = int(input())
for _ in range(T):
    K = int(input())
    min_heap = []
    max_heap = []
    elements = defaultdict(int)

    for _ in range(K):
        query = input()
        method, value = query.split()

        if method == "I":
            heappush(min_heap, int(value))
            heappush(max_heap, -1*int(value))
            elements[int(value)] += 1

        elif method == "D":
            if len(elements) == 0: continue

            # ์ตœ์†Œ๊ฐ’
            if value =="-1":
                while min_heap[0] not in elements:
                    heappop(min_heap)
                    
                popped = heappop(min_heap)
                elements[popped] -= 1
                if elements[popped] == 0: del elements[popped]

            # ์ตœ๋Œ€๊ฐ’
            elif value =="1":
                while -1*max_heap[0] not in elements:
                    heappop(max_heap)
                    
                popped = heappop(max_heap)
                elements[-1*popped] -= 1
                if elements[-1*popped] == 0: del elements[-1*popped]

    if len(elements) == 0: print("EMPTY")
    else:
        remain = sorted(list(elements))
        print(remain[-1], remain[0])

ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒ ๋„ค์š”.... ์žฌ๋ฏธ์žˆ์–ด์š”.

ํŠนํžˆ ํŒŒ์ด์ฌ์œผ๋กœ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ ์—„์ฒญ ์œ ์šฉํ•œ ๋ฌธ์ œ ๊ฐ™์•„์š”.

์ ์–ด์ฃผ์‹  ๊ฒƒ์ฒ˜๋Ÿผ ํŒŒ์ด์ฌ์—์„œ ์ตœ๋Œ€ ๊ฐ’ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ €๋Ÿฐ ์žก ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ,

์ƒ๋‹นํžˆ ์ž์ฃผ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด์—์š”!

๊ณ ์ƒํ•˜์…จ์”๋‹ˆ๋‘ฅ~~ ๐Ÿ‘๐Ÿป๐Ÿ‘๐Ÿป

Copy link
Collaborator

@SeongHoonC SeongHoonC left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ •๋ง ์ƒ์„ธํ•œ PR... ๋„ˆ๋ฌด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!
์ €๋Š” ๋งต(๋”•์…”๋„ˆ๋ฆฌ)์œผ๋กœ ์ €์žฅํ•ด์„œ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค...!
poll ํ•œ ๊ฐ’์˜ count ๊ฐ€ 0 ์ดํ•˜์ด๋ฉด (์ด๋ฏธ ๋‹ค ๋น ์กŒ์œผ๋ฉด) ๋‹ค์‹œ poll ํ•˜๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๋™๊ธฐํ™”์‹œ์ผœ์คฌ์Šต๋‹ˆ๋‹ค!

import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.Collections
import java.util.PriorityQueue

lateinit var br: BufferedReader
fun main() {
    br = BufferedReader(InputStreamReader(System.`in`))
    val T = br.readLine().toInt()

    repeat(T) {
        program()
    }
}

private fun program() {
    val pqMin = PriorityQueue<Int>()
    val pqMax = PriorityQueue<Int>(Collections.reverseOrder())

    val k = br.readLine().toInt()
    val store = mutableMapOf<Int, Int>()

    for (i in 0 until k) {
        val input = br.readLine().split(" ")
        val instruction = input[0]
        val n = input[1].toInt()

        if (instruction == "I") {
            pqMin.add(n)
            pqMax.add(n)
            store[n] = store.getOrPut(n) { 0 } + 1
            continue
        }
        if (n == -1) {
            delete(pqMin, store)
        } else {
            delete(pqMax, store)
        }
    }
    var max = pqMax.poll()
    var min = pqMin.poll()

    if (max == null || min == null) {
        println("EMPTY")
        return
    }

    while (store[max]!! <= 0) {
        max = pqMax.poll()
        if (max == null) {
            println("EMPTY")
            return
        }
    }

    while (store[min]!! <= 0) {
        min = pqMin.poll()
        if (min == null) {
            println("EMPTY")
            return
        }
    }
    println("$max $min")
}

private fun delete(pq: PriorityQueue<Int>, store: MutableMap<Int, Int>) {
    val target: Int = pq.poll() ?: return
 
   if (store[target]!! <= 0) {
        delete(pq, store)
        return
    }
    store[target] = store[target]!! - 1
}

Copy link
Collaborator

@H0ngJu H0ngJu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ž์„ธํ•œ PR ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ~~

์ €๋„ ์ผ๋‹จ 1ํŠธ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋‚˜์™”์Šต๋‹ˆ๋‹ค..

1ํŠธ์—์„œ๋Š” D 1์ด ๋‚˜์˜ฌ ๋–„๋งˆ๋‹ค ์ตœ๋Œ€ํž™์œผ๋กœ ๋ฐ”๊ฟ”์ค€ ํ›„ popํ•˜๊ณ , ๋‹ค์‹œ ์ตœ์†Œํž™์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ •์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

1 try
import sys
import heapq

def input(): return sys.stdin.readline().rstrip()

T = int(input())

def transform_heap(h):
    return [-x for x in h]

for t in range(T):
    k = int(input())
    heap = []

    command = [input().split() for _ in range(k)]
    for i in range(k):
        if command[i][0] == "I":
            heapq.heappush(heap, int(command[i][1]))
        elif command[i][0] == "D" and int(command[i][1]) == 1:
            if len(heap) > 0:
                heap = transform_heap(heap) # ์ตœ๋Œ€ ํž™์œผ๋กœ ๋ฐ”๊ฟ”์คŒ
                heapq.heapify(heap)

                heapq.heappop(heap)
                heap = transform_heap(heap) # ์ตœ์†Œ ํž™์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ

                heapq.heapify(heap)
            else: continue
        elif command[i][0] == "D" and int(command[i][1]) == -1:
            if len(heap) > 0:
                heapq.heappop(heap)

            else: continue
        else:
            print("error") # ํ™•์ธ์šฉ
    
    if len(heap) > 0:
        print(heap[0], heap[len(heap)-1])
    else:
        print("EMPTY")

D 1์ด ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ์ตœ๋Œ€ํž™์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ ๊ฒƒ ๊ฐ™์•„์š” ํ•ด๋‹น ๋ถ€๋ถ„์ด O(n)์ด๋ผ์„œ?

๊ทธ๋ž˜์„œ ์ผ๋‹จ ์ตœ์†Œ ํž™์œผ๋กœ๋Š” ์ตœ๋Œ€๊ฐ’์„ popํ•  ์ˆ˜ ์—†๊ฒ ๋‹ค ์‹ถ์–ด์„œ
์ฒ˜์Œ๋ถ€ํ„ฐ ์ตœ๋Œ€ ํž™, ์ตœ์†Œ ํž™์œผ๋กœ ๋‘๊ณ  ๋‘˜์ด ๊ณตํ†ต์ธ ๋ถ€๋ถ„๋งŒ ์ตœ์ข…์ ์œผ๋กœ list์— ๋‹ด์•„์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค !
๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ˆจ๋‹ค

  1. ์ž…๋ ฅํ•  ๋–„๋งˆ๋‹ค min_heap์™€ max_heap์— push.
  2. D -1 ์ด๋ฉด min_heap์—์„œ pop
  3. D 1 ์ด๋ฉด max_heap์—์„œ pop
  4. min_heap๊ณผ max_heap์— ๊ณตํ†ต์ ์œผ๋กœ ์žˆ๋Š” ๊ฒƒ๋งŒ ๊ณจ๋ผ์„œ heap์— ์ €์žฅํ•˜๊ณ  ์ถœ๋ ฅ

๊ทธ๋ ‡๊ฒŒ 2ํŠธ ํ–ˆ๋Š”๋ฐ ๋‹ต์ด ์•ˆ๋‚˜์˜ค๋”๋ผ๊ณ ์š”. ๋™๊ธฐํ™” ๋กœ์ง์ด ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿซ 

2 try
import sys
import heapq

def input(): return sys.stdin.readline().rstrip()

T = int(input())

def transform_heap(h):
    return [-x for x in h]

for t in range(T):
    k = int(input())
    heap = []

    max_heap = []
    min_heap = []

    command = [input().split() for _ in range(k)]
    for i in range(k):
        if command[i][0] == "I":
            heapq.heappush(max_heap, -int(command[i][1]))
            heapq.heappush(min_heap, int(command[i][1]))
        elif command[i][0] == "D" and int(command[i][1]) == 1:
            if len(max_heap) > 0:
                heapq.heappop(max_heap)
            else: continue
        elif command[i][0] == "D" and int(command[i][1]) == -1:
            if len(min_heap) > 0:
                heapq.heappop(min_heap)
            else: continue
        else:
            print("error") # ํ™•์ธ์šฉ
    
    max_len = max(len(max_heap), len(min_heap))

    if len(max_heap) == max_len:
        for i in max_heap:
            if -i in min_heap:
                heap.append(-i)
    else:
        for i in min_heap:
            if -i in max_heap:
                print("here", i)
                heap.append(i)

    if len(heap) > 0:
        print(heap[0], heap[len(heap)-1])
    else:
        print("EMPTY")

์ด์ œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ์ƒ๊ฐ์ด ์•ˆ๋‚˜์„œ ๋ฏผ์„๋‹˜ PR ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค..
๋”ฐ๋กœ True, False๋ฅผ ์ €์žฅํ•  list๋ฅผ ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ•˜๋Š”๊ตฐ์šฉ .. ๋ฐฐ์›Œ๊ฐ‘๋‹ˆ๋‹ค ... ๐Ÿ‘
๋•๋ถ„์— heap ๋ณต์Šตํ•˜๊ณ  ๊ฐ‘๋‹ˆ๋‘ฅ

@alstjr7437
Copy link
Member Author

์ž์„ธํ•œ PR ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ~~

์ €๋„ ์ผ๋‹จ 1ํŠธ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋‚˜์™”์Šต๋‹ˆ๋‹ค..

1ํŠธ์—์„œ๋Š” D 1์ด ๋‚˜์˜ฌ ๋–„๋งˆ๋‹ค ์ตœ๋Œ€ํž™์œผ๋กœ ๋ฐ”๊ฟ”์ค€ ํ›„ popํ•˜๊ณ , ๋‹ค์‹œ ์ตœ์†Œํž™์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ •์„ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

1 try
D 1์ด ๋‚˜์˜ฌ ๋•Œ๋งˆ๋‹ค ์ตœ๋Œ€ํž™์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ ๊ฒƒ ๊ฐ™์•„์š” ํ•ด๋‹น ๋ถ€๋ถ„์ด O(n)์ด๋ผ์„œ?

๊ทธ๋ž˜์„œ ์ผ๋‹จ ์ตœ์†Œ ํž™์œผ๋กœ๋Š” ์ตœ๋Œ€๊ฐ’์„ popํ•  ์ˆ˜ ์—†๊ฒ ๋‹ค ์‹ถ์–ด์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ตœ๋Œ€ ํž™, ์ตœ์†Œ ํž™์œผ๋กœ ๋‘๊ณ  ๋‘˜์ด ๊ณตํ†ต์ธ ๋ถ€๋ถ„๋งŒ ์ตœ์ข…์ ์œผ๋กœ list์— ๋‹ด์•„์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค ! ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ˆจ๋‹ค

  1. ์ž…๋ ฅํ•  ๋–„๋งˆ๋‹ค min_heap์™€ max_heap์— push.
  2. D -1 ์ด๋ฉด min_heap์—์„œ pop
  3. D 1 ์ด๋ฉด max_heap์—์„œ pop
  4. min_heap๊ณผ max_heap์— ๊ณตํ†ต์ ์œผ๋กœ ์žˆ๋Š” ๊ฒƒ๋งŒ ๊ณจ๋ผ์„œ heap์— ์ €์žฅํ•˜๊ณ  ์ถœ๋ ฅ

๊ทธ๋ ‡๊ฒŒ 2ํŠธ ํ–ˆ๋Š”๋ฐ ๋‹ต์ด ์•ˆ๋‚˜์˜ค๋”๋ผ๊ณ ์š”. ๋™๊ธฐํ™” ๋กœ์ง์ด ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿซ 

2 try

import sys
import heapq

def input(): return sys.stdin.readline().rstrip()

T = int(input())

def transform_heap(h):
    return [-x for x in h]

for t in range(T):
    k = int(input())
    heap = []

    max_heap = []
    min_heap = []

    command = [input().split() for _ in range(k)]
    for i in range(k):
        if command[i][0] == "I":
            heapq.heappush(max_heap, -int(command[i][1]))
            heapq.heappush(min_heap, int(command[i][1]))
        elif command[i][0] == "D" and int(command[i][1]) == 1:
            if len(max_heap) > 0:
                heapq.heappop(max_heap)
            else: continue
        elif command[i][0] == "D" and int(command[i][1]) == -1:
            if len(min_heap) > 0:
                heapq.heappop(min_heap)
            else: continue
        else:
            print("error") # ํ™•์ธ์šฉ
    
    max_len = max(len(max_heap), len(min_heap))

    if len(max_heap) == max_len:
        for i in max_heap:
            if -i in min_heap:
                heap.append(-i)
    else:
        for i in min_heap:
            if -i in max_heap:
                print("here", i)
                heap.append(i)

    if len(heap) > 0:
        print(heap[0], heap[len(heap)-1])
    else:
        print("EMPTY")

์ด์ œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ์ƒ๊ฐ์ด ์•ˆ๋‚˜์„œ ๋ฏผ์„๋‹˜ PR ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.. ๋”ฐ๋กœ True, False๋ฅผ ์ €์žฅํ•  list๋ฅผ ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ•˜๋Š”๊ตฐ์šฉ .. ๋ฐฐ์›Œ๊ฐ‘๋‹ˆ๋‹ค ... ๐Ÿ‘ ๋•๋ถ„์— heap ๋ณต์Šตํ•˜๊ณ  ๊ฐ‘๋‹ˆ๋‘ฅ

์˜คํ˜ธ 2๋ฒˆ์งธ ๋ฐฉ๋ฒ• ์‹ ๊ธฐํ•˜๋„ค์š”!!
2๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋”ฐ๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ๊ฑธ๊นŒ์š”?

@alstjr7437 alstjr7437 merged commit 191e484 into main May 29, 2024
10 checks passed
@alstjr7437 alstjr7437 deleted the 27-alstjr7437 branch May 29, 2024 07:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants