μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€ 풀이

BOJ 1715 : μΉ΄λ“œ μ •λ ¬ν•˜κΈ° (Python)

adorableco 2023. 2. 19. 01:25
λ°˜μ‘ν˜•

문제

https://www.acmicpc.net/problem/1715

 

1715번: μΉ΄λ“œ μ •λ ¬ν•˜κΈ°

μ •λ ¬λœ 두 묢음의 숫자 μΉ΄λ“œκ°€ μžˆλ‹€κ³  ν•˜μž. 각 묢음의 μΉ΄λ“œμ˜ 수λ₯Ό A, B라 ν•˜λ©΄ 보톡 두 λ¬ΆμŒμ„ ν•©μ³μ„œ ν•˜λ‚˜λ‘œ λ§Œλ“œλŠ” λ°μ—λŠ” A+B 번의 비ꡐλ₯Ό ν•΄μ•Ό ν•œλ‹€. 이λ₯Όν…Œλ©΄, 20μž₯의 숫자 μΉ΄λ“œ 묢음과 30μž₯

www.acmicpc.net

 

 

μ½”λ“œ

import sys
import heapq
n = int(sys.stdin.readline())

heap = []
for i in range(n):
    heapq.heappush(heap,int(sys.stdin.readline()))

total = 0

if n!=1:
    while len(heap)!=0:
        a = heapq.heappop(heap)
        b = heapq.heappop(heap)
        total += (a+b)
        if len(heap)!=0:
            heapq.heappush(heap,(a+b))

print(total)

 

 

풀이

 

μ˜ˆμ‹œμ—μ„œ 10μž₯ 20μž₯ 40μž₯ 묢음이 있으면 (10+20) + (30+40) = 100 번이 μ΅œμ†Œ 비ꡐ 횟수라고 ν–ˆλ‹€.

식을 λ‹€μ‹œ λ°”κΎΈλ©΄ (10+20) + ((10+20)+40) = 100 이닀. 이처럼 μ€‘λ³΅λ˜λŠ” 연산이 μžˆμœΌλ―€λ‘œ 이 뢀뢄을 μ΅œμ†Œν™”ν•΄μ•Ό ν•œλ‹€. → μ€‘λ³΅λ˜λŠ” 연산듀을 μ΅œμ†Ÿκ°’μœΌλ‘œ κ΅¬μ„±ν•˜λ©΄ 됨

 

κ·Έλž˜μ„œ μš°μ„  μˆœμœ„ 큐(μ •λ ¬λœ μ›μ†Œλ“€μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄)λ₯Ό μ΄μš©ν•˜μ—¬ μ΅œμ†Ÿκ°’λΌλ¦¬ λ¨Όμ € λ”ν•œ 뒀에 이 λ”ν•œ 값을 λ‹€μ‹œ μš°μ„  μˆœμœ„ 큐에 λ‹΄μ•„μ„œ 연산에 ν™œμš©ν•  수 μžˆλ„λ‘ ν•œλ‹€.

 

μ˜ˆμ‹œ)

μš°μ„  μˆœμœ„ 큐에 10 -> 20 -> 40 으둜 담겨 μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄

μž‘μ€ 두 값끼리 λ”ν•œ 것(10 + 20 = 30)을 total에 더해쀀닀. 아직 μš°μ„  μˆœμœ„ 큐 내에 μ›μ†Œκ°€ λ‚¨μ•„μžˆκΈ° λ•Œλ¬Έμ— λ”ν•œ 값을 λ‹€μ‹œ μš°μ„  μˆœμœ„ 큐에 λ„£μ–΄μ„œ 30 -> 40이 λ˜λ„λ‘ ν•œλ‹€.

 

λ˜‘κ°™μ΄ μž‘μ€ 두 값끼리 λ”ν•œ 것(30+40 = 70)을 total에 더해쀀닀.  μ΄μ œ μš°μ„  μˆœμœ„ 큐 내에 λ‚¨μ•„μžˆλŠ” μ›μ†Œκ°€ μ—†μœΌλ―€λ‘œ 이 total 값이 닡이 λœλ‹€. 

 

μœ„μ˜ 과정을 μš°μ„  μˆœμœ„ 큐 내에 μžˆλŠ” μ›μ†Œ 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄ λœλ‹€.

λ°˜μ‘ν˜•