[BOJ] Q1715 연구소

Question

Language: Python

Difficulty: Gold 4

카드를 서로 비교하면서 매번 합쳐나갈 때, 이때 비교회수의 최소값을 구하는 문제이다.

그럼 그냥 정렬을 한 후 앞에서 부터 비교를 하면 되는 것 아닌가?

예시

data=[10,10,10,10] 

|순서| 리스트| 비교횟수| |:—|:—- |:—— | |1|[20,10,10]|(10+10)| |2|[30, 10] |20 + (20+10)| |3|[]|50 + (30+10) |

총 비교회수는 90번이다. 하지만 이는 최소가 아니다…

순서 리스트 비교횟수
1 [10,10,20] (10+10)
2 [20,20] 20 + (10+10)
3 [] 40 + (20+20)

최소값은 80번이다.

비교를 할때는 항상 제일 작은 2개의 카드 뭉치를 이용 해야한다. 즉, 중간 비교를 하고 카드를 합친 후, 카드 뭉치를 넣고 정렬을 새로 수행해야한다. 이를 위해 항상 배열에서 넣고 뺄 때, 정렬을 매번 수행하는 heapsort을 활용한다.

Solution

import heapq
data=[]
n=int(input())
for _ in range(n):
    heapq.heappush(data,int(input()))

sub_sum=0
while len(data)>=2:
    result=heapq.heappop(data)+heapq.heappop(data)
    sub_sum+=result
    heapq.heappush(data,result)
print(sub_sum)

댓글남기기