๐Ÿถ Programming/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€๊ธฐ

BOJ. 7662 ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ (Python)

์ง€ ์› 2022. 12. 8. 03:25

[ ๋ฌธ์ œ ]

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

 

7662๋ฒˆ: ์ด์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ

์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” ํ‘œ์ค€์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์€ T๊ฐœ์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ž…๋ ฅ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ์ฒซ์งธ ์ค„์—๋Š” Q์— ์ 

www.acmicpc.net

[ ๋‚˜์˜ ํ’€์ด ] 

๐Ÿ”ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

์ตœ์†Œํž™, ์ตœ๋Œ€ํž™์„ ์„ ์–ธํ•˜๊ณ  ์—ฐ์‚ฐ์ด I์ธ ๊ฒฝ์šฐ์— ๊ฐ’์„ ํ•ด๋‹น ์—ฐ์‚ฐ์ด ๋ช‡๋ฒˆ์งธ์ธ์ง€ ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ €์žฅํ•œ๋‹ค.

๊ฐ’์„ ์ œ๊ฑฐํ•˜๋ฉด removed ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐํ•œ ๊ฐ’์ž„์„ ํ‘œ์‹œํ•œ๋‹ค. ์ตœ์†Œ๊ฐ’, ์ตœ๋Œ€๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ณ  ๋งŒ์•ฝ ์ œ๊ฑฐํ•œ index์˜ ๊ฐ’์ด๋ฉด ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์ตœ์†Œ๊ฐ’, ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๊ณ  ์ œ๊ฑฐํ•œ๋‹ค.

 

๐Ÿ”ธ ํ’€์ด ์ฝ”๋“œ

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

import sys, heapq
input = sys.stdin.readline

# ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ •์ˆ˜ T
T = int(input())
for _ in range(T):
    # ์ ์šฉํ•  ์—ฐ์‚ฐ์˜ ๊ฐœ์ˆ˜ k
    k = int(input())
    # ์—ฐ์‚ฐ์„ ์ €์žฅํ•  ์ตœ์†Œํž™MinQ, ์ตœ๋Œ€ํž™MaxQ
    MinQ = list()
    MaxQ = list()
    
    # ์ œ๊ฑฐํ•œ ๊ฒƒ ์ฒดํฌํ•  ๋ฆฌ์ŠคํŠธ
    removed = [False] * k

    # k๋ฒˆ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณต
    for k_idx in range(k):
        msg, n = input().split()
        # ์—ฐ์‚ฐ์ด 'I'์ธ ๊ฒฝ์šฐ
        if msg == 'I':
            heapq.heappush(MinQ, (int(n), k_idx))
            heapq.heappush(MaxQ, (-int(n), k_idx))
        # ์—ฐ์‚ฐ์ด 'D'์ธ ๊ฒฝ์šฐ
        else:
            # ์ตœ๋Œ“๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ
            if n == '1':
                while MaxQ:
                    # MaxQ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ => ์ตœ๋Œ“๊ฐ’
                    maxNum, idx = heapq.heappop(MaxQ)
                    if removed[idx] == False:
                        removed[idx] = True
                        break
                    else: continue                                          
            # ์ตœ์†Ÿ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ
            else:
                while MinQ:
                    # MinQ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ => ์ตœ์†Ÿ๊ฐ’
                    minNum, idx = heapq.heappop(MinQ)
                    if removed[idx] == False:
                        removed[idx] = True
                        break
                    else: continue                                          

    # ์ตœ๋Œ“๊ฐ’, ์ตœ์†Ÿ๊ฐ’ ์„ ์–ธ
    maxNum, minNum = None, None

    # MaxQ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด
    while MaxQ:
        # ์ตœ๋Œ“๊ฐ’ ์ฐพ๊ธฐ
        maxNum, idx = heapq.heappop(MaxQ)
        # ์ง€์šฐ์ง€ ์•Š์€ ๊ฐ’์ด๋ผ๋ฉด ์ตœ๋Œ“๊ฐ’ ์ €์žฅ
        if removed[idx] == False:
            break
        # ์ง€์šด ๊ฐ’์ด๋ผ๋ฉด ์ตœ๋Œ“๊ฐ’ ์ดˆ๊ธฐํ™”
        else: 
            maxNum = None
            continue
                           
    # MinQ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด
    while MinQ:
        # ์ตœ์†Ÿ๊ฐ’ ์ฐพ๊ธฐ
        minNum, idx = heapq.heappop(MinQ)
        # ์ง€์šฐ์ง€ ์•Š์€ ๊ฐ’์ด๋ผ๋ฉด ์ตœ์†Ÿ๊ฐ’ ์ €์žฅ
        if removed[idx] == False:
            break
        # ์ง€์šด ๊ฐ’์ด๋ผ๋ฉด ์ตœ์†Ÿ๊ฐ’ ์ดˆ๊ธฐํ™”
        else: 
            minNum = None
            continue

    if maxNum and minNum :
        print(-maxNum, minNum)
    else:
        print('EMPTY')

 

[ pair์˜ ํ’€์ด ]

๐Ÿ”ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

pair๋„ ๋˜‘๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์—ˆ๋‹ค ๐Ÿ˜€

 

๐Ÿ”ธ ํ’€์ด ์ฝ”๋“œ

import heapq
import sys
input = sys.stdin.readline

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

    # ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
    max_arr = list()
    min_arr = list()
    answer = ''

    # ์ถœ๋ ฅ ์กฐ๊ฑด ๋ณ€์ˆ˜ ์ƒ์„ฑ
    check = [False for _ in range(a)]

    for idx in range(a):
        k, n = input().split()
        # ์ฒ˜์Œ ๋ฌธ์ž๊ฐ€ I ์ผ ๋•Œ, ๋ฆฌ์ŠคํŠธ์— ์ˆซ์ž ์ถ”๊ฐ€
        if k == 'I':            
            # max ๋ฆฌ์ŠคํŠธ์™€ min ๋ฆฌ์ŠคํŠธ์— ๊ฐ๊ฐ ์ˆซ์ž ์ถ”๊ฐ€
            heapq.heappush(max_arr, (-int(n), idx))
            heapq.heappush(min_arr, (int(n), idx))

            # ํ•ด๋‹น ์ธ๋ฑ์Šค ์œ„์น˜์— ์ˆซ์ž๊ฐ€ ์žˆ์Œ์„ ํ™•์ธ
            check[idx] = True

        # ์ฒ˜์Œ ๋ฌธ์ž๊ฐ€ D ์ผ ๋•Œ
        else:
            # ์ตœ์†Œ๊ฐ’ ์ œ๊ฑฐ
            if int(n) == -1:
                # max์—์„œ ์ง€์›Œ์กŒ๋˜ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ˜๋ณต ๊ณผ์ •
                while min_arr and not check[min_arr[0][1]]:
                    heapq.heappop(min_arr)
                # min์„ ์ง€์šฐ๊ณ  ํ•ด๋‹น index๋ฅผ False๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ง€์› ๋‹ค๋Š” ๊ฒƒ์„ ์ฒดํฌ
                if min_arr:
                    check[min_arr[0][1]] = False
                    heapq.heappop(min_arr)
            # ์ตœ๋Œ€๊ฐ’ ์ œ๊ฑฐ
            else:
                # min์—์„œ ์ง€์›Œ์กŒ๋˜ ๊ฐ’์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ˜๋ณต ๊ณผ์ •
                while max_arr and not check[max_arr[0][1]]:
                    heapq.heappop(max_arr)
                # max๋ฅผ ์ง€์šฐ๊ณ  ํ•ด๋‹น index๋ฅผ False๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ง€์› ๋‹ค๋Š” ๊ฒƒ์„ ์ฒดํฌ
                if max_arr:
                    check[max_arr[0][1]] = False
                    heapq.heappop(max_arr)

    # ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ๋ฒˆ ๋” ์ˆ˜ํ–‰ํ•˜์—ฌ ์ง€์›Œ์กŒ๋˜ ๊ฐ’์„ ์ œ๊ฑฐ
    while min_arr and not check[min_arr[0][1]]:
        heapq.heappop(min_arr)
    while max_arr and not check[max_arr[0][1]]:
        heapq.heappop(max_arr)

    if max_arr and min_arr:
        answer = str(-max_arr[0][0]) + ' '
        answer += str(min_arr[0][0])
    else:
        answer = 'EMPTY'    

    print(answer)

 

pair ์˜ github : https://github.com/Ui-Seok