https://www.acmicpc.net/problem/1715
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장
www.acmicpc.net
📌 해결 과정
heap 자료구조의 장점을 정말 잘 느낄수 있는 문제이다.
먼저, 그리디 방식으로 이 문제에 접근해보면
비교횟수의 최솟값을 구해야 하므로 언제 비교횟수가 크게 증가하는지에 대해 생각해볼 필요가 있다.
카드 수가 많은 묶음일수록 최대한 마지막에 비교할 수 있도록 해야한다
예를 들어서,
묶음의 수 : 6
각 묶음에 속한 카드 : [20, 30, 40, 50, 60, 80]
card_list | compare_cnt |
20 30 40 50 60 80 | 0 |
40 50 50 60 80 | 50 |
50 60 80 90 | 50 + 90 |
80 90 110 | 50 + 90 + 110 |
110 170 | 50 + 90 + 110 + 170 |
280 (모든 카드 묶음의 비교가 끝나고 하나의 묶음이 됨) | 50 + 90 + 110 + 170 + 280 = 700 |
두 묶음의 카드의 비교를 마치면 두 묶음의 카드는 하나의 묶음으로 합쳐지기 때문에 다음에 비교할 묶음에 속하는 카드 수 보다 많다면 나중에 비교할 수 있도록 해줘야 한다.
📌 코드
import heapq
import sys
input = sys.stdin.readline
n = int(input())
card_list = []
compare_cnt = 0
for _ in range(n):
heapq.heappush(card_list, int(input()))
# 카드 묶음이 하나라면 비교할 필요가 없으므로 0을 출력한다.
if len(card_list) == 1:
print(0)
else:
while len(card_list) > 1:
comp1 = heapq.heappop(card_list)
comp2 = heapq.heappop(card_list)
compare_cnt += comp1 + comp2
heapq.heappush(card_list, comp1 + comp2)
print(compare_cnt)
'algorithm > Greedy' 카테고리의 다른 글
백준 11000 강의실 배정 (0) | 2022.10.13 |
---|---|
백준 18234 당근 훔쳐 먹기 (1) | 2022.10.13 |
프로그래머스 조이스틱 (0) | 2022.09.28 |
프로그래머스 체육복 (0) | 2022.09.28 |
백준 1339 단어수학 (0) | 2022.09.04 |