🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] μ΄μ€‘μš°μ„ μˆœμœ„ν (level3, python)

개발자 HOON 2022. 9. 9. 15:15

문제 μ„€λͺ…

 

이쀑 μš°μ„ μˆœμœ„ νλŠ” λ‹€μŒ 연산을 ν•  수 μžˆλŠ” 자료ꡬ쑰λ₯Ό λ§ν•©λ‹ˆλ‹€.

 

λͺ…λ Ήμ–΄μˆ˜μ‹  탑(높이)
I 숫자 큐에 주어진 숫자λ₯Ό μ‚½μž…ν•©λ‹ˆλ‹€.
D 1 νμ—μ„œ μ΅œλŒ“κ°’μ„ μ‚­μ œν•©λ‹ˆλ‹€.
D -1 νμ—μ„œ μ΅œμ†Ÿκ°’μ„ μ‚­μ œν•©λ‹ˆλ‹€.

 

이쀑 μš°μ„ μˆœμœ„ 큐가 ν•  μ—°μ‚° operationsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, λͺ¨λ“  연산을 μ²˜λ¦¬ν•œ ν›„ 큐가 λΉ„μ–΄μžˆμœΌλ©΄ [0,0] λΉ„μ–΄μžˆμ§€ μ•ŠμœΌλ©΄ [μ΅œλŒ“κ°’, μ΅œμ†Ÿκ°’]을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­
 
  • operationsλŠ” 길이가 1 이상 1,000,000 μ΄ν•˜μΈ λ¬Έμžμ—΄ λ°°μ—΄μž…λ‹ˆλ‹€.
  • operations의 μ›μ†ŒλŠ” 큐가 μˆ˜ν–‰ν•  연산을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • μ›μ†ŒλŠ” “λͺ…λ Ήμ–΄ 데이터” ν˜•μ‹μœΌλ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.- μ΅œλŒ“κ°’/μ΅œμ†Ÿκ°’μ„ μ‚­μ œν•˜λŠ” μ—°μ‚°μ—μ„œ μ΅œλŒ“κ°’/μ΅œμ†Ÿκ°’μ΄ λ‘˜ 이상인 경우, ν•˜λ‚˜λ§Œ μ‚­μ œν•©λ‹ˆλ‹€.
  • 빈 큐에 데이터λ₯Ό μ‚­μ œν•˜λΌλŠ” 연산이 μ£Όμ–΄μ§ˆ 경우, ν•΄λ‹Ή 연산은 λ¬΄μ‹œν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예
operations return
["I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"] [0,0]
["I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"] [333, -45]

μž…μΆœλ ₯ 예 μ„€λͺ…

 

μž…μΆœλ ₯ 예 #1

 

  • 16κ³Ό -5643을 μ‚½μž…ν•©λ‹ˆλ‹€.
  • μ΅œμ†Ÿκ°’μ„ μ‚­μ œν•©λ‹ˆλ‹€. -5643이 μ‚­μ œλ˜κ³  16이 λ‚¨μ•„μžˆμŠ΅λ‹ˆλ‹€.
  • μ΅œλŒ“κ°’μ„ μ‚­μ œν•©λ‹ˆλ‹€. 16이 μ‚­μ œλ˜κ³  이쀑 μš°μ„ μˆœμœ„ νλŠ” λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€.
  • μš°μ„ μˆœμœ„ 큐가 λΉ„μ–΄μžˆμœΌλ―€λ‘œ μ΅œλŒ“κ°’ μ‚­μ œ 연산이 λ¬΄μ‹œλ©λ‹ˆλ‹€.
  • 123을 μ‚½μž…ν•©λ‹ˆλ‹€.
  • μ΅œμ†Ÿκ°’μ„ μ‚­μ œν•©λ‹ˆλ‹€. 123이 μ‚­μ œλ˜κ³  이쀑 μš°μ„ μˆœμœ„ νλŠ” λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ [0, 0]을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예 #2

  • -45와 653을 μ‚½μž…ν›„ μ΅œλŒ“κ°’(653)을 μ‚­μ œν•©λ‹ˆλ‹€. -45κ°€ λ‚¨μ•„μžˆμŠ΅λ‹ˆλ‹€.
  • -642, 45, 97을 μ‚½μž… ν›„ μ΅œλŒ“κ°’(97), μ΅œμ†Ÿκ°’(-642)을 μ‚­μ œν•©λ‹ˆλ‹€. -45와 45κ°€ λ‚¨μ•„μžˆμŠ΅λ‹ˆλ‹€.
  • 333을 μ‚½μž…ν•©λ‹ˆλ‹€.

이쀑 μš°μ„ μˆœμœ„ 큐에 -45, 45, 333이 λ‚¨μ•„μžˆμœΌλ―€λ‘œ, [333, -45]λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

 


 

풀이 μ½”λ“œ

import heapq

def solution(operations):
    min_heap = []
    max_heap = []
    
    for ops in operations:
        alpha, num = ops.split()
        if alpha == 'I':
            heapq.heappush(min_heap, int(num))
            heapq.heappush(max_heap, -int(num))
        else:
            if len(min_heap) > 0:
                if num == '1':
                    val = heapq.heappop(max_heap) * -1
                    min_heap.remove(val)
                    heapq.heapify(min_heap)
                else:
                    val = heapq.heappop(min_heap) * -1
                    max_heap.remove(val)
                    heapq.heapify(max_heap)
    
    if min_heap and max_heap:
        answer = [-heapq.heappop(max_heap), heapq.heappop(min_heap)]
    else:
        answer = [0,0]
    return answer

λ‹¨μˆœνžˆ 이쀑 μš°μ„ μˆœμœ„ 큐λ₯Ό λ§Œλ“œλŠ” λ¬Έμ œμ˜€λ‹€.

파이썬의 heapqλ₯Ό ν†΅ν•΄μ„œ μ΅œλŒ€νž™κ³Ό μ΅œμ†Œνž™μ„ ꡬ성할 수 μžˆλ‹€.

 

heapq.heappush(list, element) : νž™μ˜ νŠΉμ„±μ„ μœ μ§€ν•˜λ©΄μ„œ μ›μ†Œλ₯Ό μ‚½μž…ν•˜λŠ” ν•¨μˆ˜, min_heap을 κΈ°μ€€μœΌλ‘œ λ§Œλ“€μ–΄μ Έ μžˆλ‹€.

heapq.heappop(list) : νž™μ˜ λ£¨νŠΈλ…Έλ“œ λ°˜ν™˜, λ‚˜λ¨Έμ§€ ꡬ쑰 heapify 진행

heapq.heapify(list) : νž™μ΄ μ•„λ‹Œ 리슀트λ₯Ό νž™ ꡬ쑰둜 λ³€ν™˜.

 

μ΄λ•Œ element에 음수 처리λ₯Ό ν•΄μ£Όκ³ , 값을 κΊΌλ‚Ό λ•Œ λ‹€μ‹œ 음수 처리λ₯Ό ν•΄μ£Όλ©΄ μ΅œλŒ€ νž™μ²˜λŸΌ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ—

μœ„μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμ—ˆλ‹€.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ 쑰금 λΉˆμ•½ν•œ 문제인 것 κ°™κΈ°λŠ” ν•˜λ‹€..