λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⭐ Problem_Solving/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 고득점 kit - νž™(Heap) (Python/파이썬)

by ν¬μŠ€νŠΈμ‰μ΄ν¬ 2023. 2. 4.

<문제 링크>

https://school.programmers.co.kr/learn/courses/30/parts/12117

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

<풀이 μ „λž΅>

1. 더 맡게: λ²”μœ„κ°€ 2 ~ 1,000,000μ΄λ―€λ‘œ μš°μ„ μˆœμœ„ν(파이썬의 경우 νž™ν)λ₯Ό 적절히 μ΄μš©ν•΄μ„œ κ΅¬ν˜„ν•΄μ£Όλ©΄ λœλ‹€.

 

2. λ””μŠ€ν¬ 컨트둀러: 그리디 + μš°μ„ μˆœμœ„ 큐 문제. μš”μ²­μ‹œμ  순으둜 μ •λ ¬ν•˜κ³  μš°μ„ μˆœμœ„ 큐λ₯Ό μ΄μš©ν•΄ λ‹€μŒ μž‘μ—…μ„ μΆ”μΆœν•΄μ„œ ν˜„μž¬ 진행쀑인 μž‘μ—… + λˆ„μ  μ‹œκ°„μ„ 계속 κ°±μ‹ ν•΄μ£Όλ©΄ λœλ‹€. μ†Œμš” μ‹œκ°„ 순으둜 μΆ”μΆœν•˜κΈ° μœ„ν•΄ νž™μ— 넣을 λ•Œ μˆœμ„œλ₯Ό λ’€μ§‘μ–΄μ„œ λ„£μ–΄μ€˜μ•Όλœλ‹€.

 

3. μ΄μ€‘μš°μ„ μˆœμœ„ν: μ΅œλŒ€νž™λ§Œ 잘 κ΅¬ν˜„ν•˜λ©΄ 어렡지 μ•Šλ‹€.

 

<μ •λ‹΅ μ½”λ“œ>

# 1. 더 맡게

import heapq

def solution(scoville, K):
    
    # μš°μ„ μˆœμœ„ν
    heapq.heapify(scoville)
    
    # μ„žκΈ°
    def mix(scoville):    
        # κ°€μž₯ 덜 맀운 2개 μš°μ„ μˆœμœ„νλ‘œ μΆ”μΆœ
        first = heapq.heappop(scoville)
        second = heapq.heappop(scoville)
        
        # μ„žκΈ°
        heapq.heappush(scoville, first + second * 2)
        
        return scoville

    answer = 0
    
    while True:

        # λͺ¨λ“  μŒμ‹μ˜ μŠ€μ½”λΉŒ μ§€μˆ˜λ₯Ό Kμ΄μƒμœΌλ‘œ λ§Œλ“€ 수 μ—†λŠ” 경우
        if len(scoville) == 1 and K > scoville[0]:
            answer = -1
            break
        
        # λͺ¨λ“  μŒμ‹μ˜ μŠ€μ½”λΉŒ μ§€μˆ˜κ°€ K이상이 λ˜μ—ˆμ„ λ•Œ
        if scoville[0] >= K:
            break
        
        # μ„žκΈ°
        scoville = mix(scoville)
        
        answer += 1


    return answer

 

# 2. λ””μŠ€ν¬ 컨트둀러

import heapq

def solution(jobs):
    answer = 0
    
    # idx: μž‘μ—… 번호, time: ν˜„μž¬ 진행쀑인 μž‘μ—… 마무리 μ‹œκ°„
    idx = 0
    time = 0 
    
    # μ²˜λ¦¬ν•œ μž‘μ—… 개수
    cnt = 0
    
    # μš”μ²­ μ‹œμ  순으둜 μ •λ ¬
    jobs.sort()
    
    # μž‘μ—… λŒ€κΈ° 큐
    heap = []
    
    while len(jobs) > cnt:
        
        # 아직 큐에 μ˜¬λΌκ°€μ§€ μ•ŠλŠ” μž‘μ—…μ΄ μžˆμ„ λ•Œ
        if idx < len(jobs):
            for i in range(idx, len(jobs)):
                # μš”μ²­ μ‹œκ°„μ΄ ν˜„μž¬ μž‘μ—… 마무리 μ‹œκ°„ 이전일 경우 (μ΄μ–΄μ„œ λ°”λ‘œ ν•  수 μžˆλŠ” 경우)
                if jobs[i][0] <= time:
                    # μ†Œμš”μ‹œκ°„, μš”μ²­μ‹œκ°„ 순으둜 λ„£κΈ°
                    heapq.heappush(heap, jobs[i][::-1])
                    idx = i + 1
        
        # 큐에 μž‘μ—…μ΄ μžˆμ„ 경우
        if heap:
            # current: ν˜„μž¬ 진행할 μž‘μ—… νμ—μ„œ λΉΌκΈ°
            current = heapq.heappop(heap)
            
            # 마무리 μ‹œκ°„ 계산
            time += current[0]
            
            # λŒ€κΈ° μ‹œκ°„ 계산
            answer += time - current[1]
            
            cnt += 1
        
        # 큐에 μž‘μ—…μ΄ μ—†λŠ” 경우 λ°”λ‘œ μž‘μ—… λ“±λ‘ν•˜κΈ°
        elif idx < len(jobs):
            time  = jobs[idx][0]
    
    # 평균 계산
    answer //= len(jobs)

    return answer

 

# 3. μ΄μ€‘μš°μ„ μˆœμœ„ν

import heapq


def solution(operations):
    answer = [0, 0]
    heap = []
    
    
    for operation in operations:
        
        # μ‚½μž… μ—°μ‚°μž
        if operation[0] == 'I':
            heapq.heappush(heap, int(operation[2:]))
        
        # μ‚­μ œμ—°μ‚°μž
        else:
            if not heap:
                continue
            
            # μ΅œμ†Ÿκ°’ μ‚­μ œ
            if operation[2] == '-':
                heapq.heappop(heap)
            # μ΅œλŒ“κ°’ μ‚­μ œ
            else:
                heap.remove(max(heap))
    
    # μ •λ‹΅ λ°˜ν™˜
    if heap: 
        answer = [max(heap), min(heap)]

    return answer

λŒ“κΈ€