DevYoon

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] λ””νŽœμŠ€ κ²Œμž„ (Python) λ³Έλ¬Έ

PS/Programmers

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] λ””νŽœμŠ€ κ²Œμž„ (Python)

gimewn 2023. 2. 7. 22:28

link πŸ”— https://school.programmers.co.kr/learn/courses/30/lessons/142085

 

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

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

programmers.co.kr

 

문제 μ„€λͺ…

μ€€ν˜ΈλŠ” μš”μ¦˜ λ””νŽœμŠ€ κ²Œμž„μ— ν‘Ή λΉ μ Έ μžˆμŠ΅λ‹ˆλ‹€. λ””νŽœμŠ€ κ²Œμž„μ€ μ€€ν˜Έκ°€ λ³΄μœ ν•œ 병사 nλͺ…μœΌλ‘œ μ—°μ†λ˜λŠ” 적의 곡격을 μˆœμ„œλŒ€λ‘œ λ§‰λŠ” κ²Œμž„μž…λ‹ˆλ‹€. λ””νŽœμŠ€ κ²Œμž„μ€ λ‹€μŒκ³Ό 같은 κ·œμΉ™μœΌλ‘œ μ§„ν–‰λ©λ‹ˆλ‹€.

  • μ€€ν˜ΈλŠ” μ²˜μŒμ— 병사 nλͺ…을 가지고 μžˆμŠ΅λ‹ˆλ‹€.
  • 맀 λΌμš΄λ“œλ§ˆλ‹€ enemy[i]마리의 적이 λ“±μž₯ν•©λ‹ˆλ‹€.
  • 남은 병사 쀑 enemy[i]λͺ… 만큼 μ†Œλͺ¨ν•˜μ—¬ enemy[i]마리의 적을 막을 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄ 남은 병사가 7λͺ…이고, 적의 μˆ˜κ°€ 2마리인 경우, ν˜„μž¬ λΌμš΄λ“œλ₯Ό λ§‰μœΌλ©΄ 7 - 2 = 5λͺ…μ˜ 병사가 λ‚¨μŠ΅λ‹ˆλ‹€.
    • 남은 λ³‘μ‚¬μ˜ μˆ˜λ³΄λ‹€ ν˜„μž¬ λΌμš΄λ“œμ˜ 적의 μˆ˜κ°€ 더 많으면 κ²Œμž„μ΄ μ’…λ£Œλ©λ‹ˆλ‹€.
  • κ²Œμž„μ—λŠ” λ¬΄μ κΆŒμ΄λΌλŠ” μŠ€ν‚¬μ΄ 있으며, λ¬΄μ κΆŒμ„ μ‚¬μš©ν•˜λ©΄ λ³‘μ‚¬μ˜ μ†Œλͺ¨μ—†μ΄ ν•œ λΌμš΄λ“œμ˜ 곡격을 막을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ¬΄μ κΆŒμ€ μ΅œλŒ€ k번 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ€€ν˜ΈλŠ” λ¬΄μ κΆŒμ„ μ μ ˆν•œ μ‹œκΈ°μ— μ‚¬μš©ν•˜μ—¬ μ΅œλŒ€ν•œ λ§Žμ€ λΌμš΄λ“œλ₯Ό μ§„ν–‰ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

μ€€ν˜Έκ°€ 처음 가지고 μžˆλŠ” λ³‘μ‚¬μ˜ 수 n, μ‚¬μš© κ°€λŠ₯ν•œ 무적ꢌ의 횟수 k, 맀 λΌμš΄λ“œλ§ˆλ‹€ κ³΅κ²©ν•΄μ˜€λŠ” 적의 μˆ˜κ°€ μˆœμ„œλŒ€λ‘œ λ‹΄κΈ΄ μ •μˆ˜ λ°°μ—΄ enemyκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. μ€€ν˜Έκ°€ λͺ‡ λΌμš΄λ“œκΉŒμ§€ 막을 수 μžˆλŠ”μ§€ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­
  • 1 ≤ n ≤ 1,000,000,000
  • 1 ≤ k ≤ 500,000
  • 1 ≤ enemy의 길이 ≤ 1,000,000
  • 1 ≤ enemy[i] ≤ 1,000,000
  • enemy[i]μ—λŠ” i + 1 λΌμš΄λ“œμ—μ„œ κ³΅κ²©ν•΄μ˜€λŠ” 적의 μˆ˜κ°€ λ‹΄κ²¨μžˆμŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  λΌμš΄λ“œλ₯Ό 막을 수 μžˆλŠ” κ²½μš°μ—λŠ” enemy[i]의 길이λ₯Ό return ν•΄μ£Όμ„Έμš”.

 


 

import heapq

def solution(n, k, enemy):
    answer = 0
    total_enemy = 0
    heap = []
    
    for e in enemy:
        # maxHeap -> - λ‹¬μ•„μ„œ push
        heapq.heappush(heap, -e)
        # 적 더해주기
        total_enemy += e
        
        # ν˜„μž¬κΉŒμ§€ 적의 합이 병사보닀 크닀면
        if total_enemy > n:
            
            # λ¬΄μ κΆŒμ„ λ‹€ 썼닀면 break
            if k == 0:
                break
            
            # 무적ꢌ -= 1
            k -= 1
            # 제일 큰 적을 heapμ—μ„œ κ°€μ Έμ˜΄
            biggest = heapq.heappop(heap)
            # total_enemy += -(제일 큰 적) -> 빼주기
            total_enemy += biggest
            
        # λΌμš΄λ“œ += 1
        answer += 1
            
    return answer

 

✏️ μ›λž˜λŠ” λ¬΄μ κΆŒμ„ μ“Έ 수 μžˆλŠ” 경우의 수λ₯Ό κ΅¬ν•˜κ³ , κ°€μž₯ 많이 버틴 λΌμš΄λ“œ 수λ₯Ό 각 경우의 μˆ˜λ§ˆλ‹€ 계산해주렀고 ν–ˆλ‹€. 그런데 μ œν•œμ‚¬ν•­μ˜ λ²”μœ„κ°€ λ„“μ–΄μ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ 났닀.

✏️ Max Heap을 ν™œμš©ν•˜μ—¬ ν’€μ΄ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅μ²΄ν–ˆκ³ , μ‹œκ°„μ΄ˆκ³Ό 없이 정닡이 λ„μΆœλ˜μ—ˆλ‹€!