Algorithm/Programmers

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] μ•Όκ·Ό μ§€μˆ˜ / 파이썬 / Python / heap

rmsidgkrl 2021. 12. 26. 22:06
728x90
λ°˜μ‘ν˜•

 

πŸ’‘ solutions  

πŸ’¬ μ•Όκ·Ό ν”Όλ‘œλ„λ₯Ό μ΅œμ†Œν•œμœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” 주어진 Nμ‹œκ°„ λ™μ•ˆ works 리슀트 μ•ˆμ˜ μž‘μ—…λŸ‰ μš”μ†Œλ“€μ„ κ°€μž₯ 큰 κ°’λΆ€ν„° -1μ”© μ€„μ—¬λ‚˜κ°€λŠ” 과정이 ν•„μš”ν•˜λ‹€.

πŸ’¬ works와 n의 크기λ₯Ό κ³ λ €ν–ˆμ„ λ•Œ, νš¨μœ¨μ„±μ„ ν†΅κ³Όν•˜κΈ° μœ„ν•΄μ„œλŠ” 값을 λΉ„κ΅ν•˜λŠ” λ‘œμ§μ„ μœ„ν•΄ heaq 자료 ꡬ쑰λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

πŸ’¬ 주어진 예제 쀑에 3번과 같이 주어진 Nμ‹œκ°„ λ™μ•ˆμ— λͺ¨λ“  μž‘μ—…λŸ‰μ„ λͺ¨λ‘ 끝마칠 수 μžˆλŠ” κ²½μš°μ—λŠ” 0을 λ°”λ‘œ 리턴할 수 μžˆλ„λ‘ 쑰건을 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€.

 

πŸ‘¨‍πŸ’» code  

import heapq

def solution(n, works):
    answer = 0
    if sum(works) <= n:
        return 0

    hq = []
    for i in works:
        heapq.heappush(hq, -i)

    while n:
        max_work = heapq.heappop(hq) + 1
        n -= 1
        heapq.heappush(hq, max_work)

    return sum([i**2 for i in hq])

 

 

πŸ“Œ problem  

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - μ•Όκ·Ό μ§€μˆ˜

νšŒμ‚¬μ› DemiλŠ” 가끔은 야근을 ν•˜λŠ”λ°μš”, 야근을 ν•˜λ©΄ μ•Όκ·Ό ν”Όλ‘œλ„κ°€ μŒ“μž…λ‹ˆλ‹€. μ•Όκ·Ό ν”Όλ‘œλ„λŠ” 야근을 μ‹œμž‘ν•œ μ‹œμ μ—μ„œ 남은 일의 μž‘μ—…λŸ‰μ„ μ œκ³±ν•˜μ—¬ λ”ν•œ κ°’μž…λ‹ˆλ‹€. DemiλŠ” Nμ‹œκ°„ λ™μ•ˆ μ•Όκ·Ό ν”Όλ‘œλ„

programmers.co.kr


문제 μ„€λͺ…

νšŒμ‚¬μ› DemiλŠ” 가끔은 야근을 ν•˜λŠ”λ°μš”, 야근을 ν•˜λ©΄ μ•Όκ·Ό ν”Όλ‘œλ„κ°€ μŒ“μž…λ‹ˆλ‹€. μ•Όκ·Ό ν”Όλ‘œλ„λŠ” 야근을 μ‹œμž‘ν•œ μ‹œμ μ—μ„œ 남은 일의 μž‘μ—…λŸ‰μ„ μ œκ³±ν•˜μ—¬ λ”ν•œ κ°’μž…λ‹ˆλ‹€. DemiλŠ” Nμ‹œκ°„ λ™μ•ˆ μ•Όκ·Ό ν”Όλ‘œλ„λ₯Ό μ΅œμ†Œν™”ν•˜λ„λ‘ 일할 κ²λ‹ˆλ‹€.Demiκ°€ 1μ‹œκ°„ λ™μ•ˆ μž‘μ—…λŸ‰ 1λ§ŒνΌμ„ μ²˜λ¦¬ν•  수 μžˆλ‹€κ³  ν•  λ•Œ, ν‡΄κ·ΌκΉŒμ§€ 남은 N μ‹œκ°„κ³Ό 각 일에 λŒ€ν•œ μž‘μ—…λŸ‰ works에 λŒ€ν•΄ μ•Όκ·Ό ν”Όλ‘œλ„λ₯Ό μ΅œμ†Œν™”ν•œ 값을 λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ solution을 μ™„μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œ 사항
  • worksλŠ” 길이 1 이상, 20,000 μ΄ν•˜μΈ λ°°μ—΄μž…λ‹ˆλ‹€.
  • works의 μ›μ†ŒλŠ” 50000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • n은 1,000,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
μž…μΆœλ ₯ 예
[4, 3, 3] 4 12
[2, 1, 2] 1 6
[1,1] 3 0
μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
n=4 일 λ•Œ, 남은 일의 μž‘μ—…λŸ‰μ΄ [4, 3, 3] 이라면 μ•Όκ·Ό μ§€μˆ˜λ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 4μ‹œκ°„λ™μ•ˆ 일을 ν•œ κ²°κ³ΌλŠ” [2, 2, 2]μž…λ‹ˆλ‹€. 이 λ•Œ μ•Όκ·Ό μ§€μˆ˜λŠ” 22 + 22 + 22 = 12 μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2
n=1일 λ•Œ, 남은 일의 μž‘μ—…λŸ‰μ΄ [2,1,2]라면 μ•Όκ·Ό μ§€μˆ˜λ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ 1μ‹œκ°„λ™μ•ˆ 일을 ν•œ κ²°κ³ΌλŠ” [1,1,2]μž…λ‹ˆλ‹€. μ•Όκ·Όμ§€μˆ˜λŠ” 12 + 12 + 22 = 6μž…λ‹ˆλ‹€.


λ°˜μ‘ν˜•