🌞Algorithm/πŸ”₯programmers

[programmers] μ΄μ€‘μš°μ„ μˆœμœ„ν

λΏŒμ•Ό._. 2021. 8. 25. 22:32

μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅ - νž™ (Heap)


<μ΄μ€‘μš°μ„ μˆœμœ„ν>

문제 μ„€λͺ…

 

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

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

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

 

 

μ œν•œ 사항

 

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

 

 

문제 풀이

 

- my solution

import heapq

def solution(operations):
    result = []
    
    for i in operations:
        x = i.split()

        if x[0] == "I": # 숫자 μ‚½μž…
            heapq.heappush(result, int(x[1]))
        elif x[0] == "D":
            if x[1] == "-1": # μ΅œμ†Ÿκ°’ μ‚­μ œ
                if len(result)!=0:
                    heapq.heappop(result)
            else: # μ΅œλŒ“κ°’ μ‚­μ œ
                temp = []
                for j in result: # μ΅œλŒ€ νž™ λ§Œλ“€κΈ°
                    heapq.heappush(temp, -int(j))
                if len(temp) != 0: # λΉ„μ–΄μžˆμ§€ μ•ŠμœΌλ©΄ μ‚­μ œ
                    heapq.heappop(temp)
                result = []
                for j in temp: # μ›λž˜λŒ€λ‘œ
                    heapq.heappush(result, -j)
        
    answer=[]
    if len(result) == 0: #큐가 λΉ„μ–΄μžˆμœΌλ©΄
        answer = [0, 0]
    else: # λΉ„μ–΄μžˆμ§€ μ•ŠμœΌλ©΄
        k = heapq.heappop(result) # μ΅œμ†Ÿκ°’
        temp = []
        for j in result: # μ΅œλŒ€ νž™
            heapq.heappush(temp, -j)
        answer.append(-heapq.heappop(temp)) # μ΅œλŒ“κ°’
        answer.append(k) # μ΅œμ†Ÿκ°’
            
    return answer

 

1) split을 ν†΅ν•˜μ—¬ λΆ„λ¦¬ν•˜μ—¬ λͺ…λ Ήμ–΄κ°€ I 일 λ•Œ, D 일 λ•Œλ₯Ό κ΅¬λΆ„ν•˜μ—¬ κ΅¬ν˜„


μƒκ°πŸ€”

 

Level 3μ΄μ—ˆμ§€λ§Œ 크게 μ–΄λ ΅μ§€ μ•Šμ•˜λ˜ λ¬Έμ œμ˜€λ‹€. 레벨이 λ†’μ•„ 문제 ν΄λ¦­ν•˜κΈ° 어렀웠을 뿐...

μ΅œκ·Όμ— heapq에 λŒ€ν•˜μ—¬ 문제λ₯Ό ν’€μ–΄λ΄€λ˜ 것이 크게 도움이 λ˜μ—ˆλ‹€.

μœ„μ—μ„œ μ½”λ“œ μ„€λͺ…이 μ§§μ•˜λ˜ 것도, heapq만 μ•Œλ©΄ μ‰½κ²Œ ν’€ 수 μžˆμ„ 거라 μƒκ°ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

λ‚΄κ°€ μƒκ°ν•˜κΈ°μ— 이 문제의 ν¬μΈνŠΈλŠ”

1) heapq μ‚¬μš©

2) μ΅œμ†Œ νž™, μ΅œλŒ€ νž™ 

인 것 κ°™λ‹€. λ‹€ν–‰νžˆλ„ μ΅œμ†Œ νž™, μ΅œλŒ€ νž™μ„ κ΅¬ν˜„ν•  쀄 μ•ŒκΈ°μ— 빨리 ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€.

 

ν•˜μ§€λ§Œ, 살짝 의문점이 λ“œλŠ” 것은, 'μ΅œμ†Œ νž™μ΄ κ΅¬ν˜„λœ μƒνƒœμ—μ„œ μ΅œλŒ€ νž™μ„ κ΅¬ν˜„ν•  λ•Œ

λͺ¨λ“  μ›μ†Œμ˜ 값을 가져와 μ΅œλŒ€ νž™μœΌλ‘œ λ‹€μ‹œ κ΅¬ν˜„ν•˜λŠ” 방법밖에 μ—†λŠ”κ°€?'μ˜€λ‹€.

쑰금 더 곡뢀해봐야겠닀πŸ˜₯

 

문제λ₯Ό ν’€λ©΄μ„œ 얻은 것

1. heapq

2. μ΅œλŒ€ νž™, μ΅œμ†Œ νž™

 


좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μ½”λ”© ν…ŒμŠ€νŠΈ μ—°μŠ΅, https://programmers.co.kr/learn/challenges