Algorithm Problem/Python

[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μ•Όκ·Ό μ§€μˆ˜

deo2kim 2020. 9. 11. 08:38
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

Lv3

κ°€μž₯ 큰 값을 쑰금 μ”© μ€„μ—¬λ‚˜κ°€μ•Ό ν•˜λŠ” 문제! - μš°μ„ μˆœμœ„ 큐λ₯Ό μ΄μš©ν–ˆλ‹€.

 

μš°μ„ μˆœμœ„ νλŠ” λ¦¬μŠ€νŠΈμ—μ„œ pop()을 ν•˜κ²Œ 되면 κ°€μž₯ μž‘μ€ 값이 λ‚˜μ˜€κ²Œ λœλ‹€.

μ—¬κΈ°μ„œλŠ” κ°€μž₯ 큰 값을 κΊΌλ‚΄μ•Ό ν•˜λ―€λ‘œ 각각의 값을 음수둜 νž™νμ— λ„£μ–΄ 쀬닀.

 

κ°€μž₯ μž‘μ€ κ°’(사싀은 κ°€μž₯ 큰 κ°’)을 κΊΌλ‚΄μ„œ 1μ”© 더해쀀닀.

그리고 λ‹€μ‹œ νž™νμ— λ„£μ–΄μ€€λ‹€.

 

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 1λ²ˆμ„ 풀이 ν•΄ 보자. 4, [4, 3, 3]

μœ„ 그림의 첫째쀄은 처음 νž™νμ— λ„£μ—ˆμ„ λ•Œμ΄λ‹€.

λ‹€μŒ μ€„λΆ€ν„°λŠ” 1μ‹œκ°„μ”© μ§€λ‚  λ•Œ λ§ˆλ‹€μ˜ νž™νμ˜ 상황이닀.

 

  1. -4κ°€ 제일 μž‘μœΌλ―€λ‘œ -4λ₯Ό κΊΌλ‚΄μ„œ 1을 더해주고 λ‹€μ‹œ λ„£λŠ”λ‹€.
  2. -3을 κΊΌλ‚΄μ„œ 1을 더해주고 λ‹€μ‹œ λ„£λŠ”λ‹€.
  3. 또 -3을 κΊΌλ‚΄μ„œ 1을 더해주고 λ‹€μ‹œ λ„£λŠ”λ‹€.
  4. λ§ˆμ§€λ§‰μœΌλ‘œ -3을 κΊΌλ‚΄μ„œ 1을 더해주고 λ‹€μ‹œ λ„£λŠ”λ‹€.

결과적으둜 남은 일듀을 μ œκ³±ν•΄μ„œ 더해주면 끝!

 

πŸ’¨ νž™νλ₯Ό μ‚¬μš©ν–ˆλ”λ‹ˆ νš¨μœ¨μ„±ν…ŒμŠ€νŠΈμ—μ„œ 크게 λ‚˜μ˜€κΈ΄ ν–ˆλ‹€( νž™νλ₯Ό μ“°μ§€ μ•Šμ€ μ–΄λ–€ λ‹€λ₯Έ 뢄에 λΉ„ν•΄μ„œ ... )

ν•˜μ§€λ§Œ νž™νλ₯Ό 써도 λ¬΄λ‚œν•˜κ²Œ 톡과할 수 μžˆλ”°!

πŸ’»μ†ŒμŠ€ μ½”λ“œ

import heapq


def solution(n, works):
    answer = 0
    
    # νž™ν λ§Œλ“€κΈ°!
    pq = []
    for work in works:
        heapq.heappush(pq, -work)
    
    # n만큼 반볡
    for i in range(n):
        work = heapq.heappop(pq)
        if work == 0:  # κΊΌλ‚Έ 값이 0이면 λͺ¨λ“  일이 λ‹€ 0μ΄λ―€λ‘œ μ’…λ£Œ
            return 0
        heapq.heappush(pq, work+1)  # ν•œμ‹œκ°„ μΌν•˜κ³  λ‹€μ‹œ νž™νμ— μ €μž₯
    for work in pq:
        answer += work ** 2

    return answer

 

πŸ“•λ¬Έμ œ 확인

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

링크: https://programmers.co.kr/learn/courses/30/lessons/12927

 

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

νšŒμ‚¬μ› 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 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

worksnresult

[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μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #3

λ°˜μ‘ν˜•