MapleStory Finger Point

[BOJ] #1715 - 카드 정렬하기

2021. 6. 18. 16:17Problem Solving/Online Judge

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

 

 

** 문제 유형

  • 힙, 자료구조, 그리디

 

** 풀이

  1. 가장 크기가 작은 숫자 카드 묶음들을 먼저 합쳤을 때, 비교 횟수가 가장 적음
    • (10, 20, 40) ---30---> (30, 40) ---70---> (70)
    • (40, 10, 20) ---50---> (50, 20) ---70---> (70)
  2. 가장 크기가 작은 숫자 카드 묶음들을 2개씩 합치기 위해, 힙 자료구조를 이용

 

import heapq

n = int(input())

heap = []
rslt = 0

for _ in range(n):
    data = int(input())

    heapq.heappush(heap, data) # 최소 힙 구조

while len(heap) != 1: # 힙에 원소가 1개 남을 때까지
    first = heapq.heappop(heap) # 가장 작은 수부터 꺼냄
    second = heapq.heappop(heap)

    heapq.heappush(heap, first + second)
    rslt += first + second
    
print(rslt)

 

 

 

'Problem Solving > Online Judge' 카테고리의 다른 글

[BOJ] #1260 - DFS와 BFS  (0) 2021.06.19
[BOJ] #1766 - 문제집  (0) 2021.06.18
[BOJ] #1926 - 최소 힙  (0) 2021.06.18
[BOJ] #2250 - 트리의 높이와 너비  (0) 2021.06.18
[BOJ] #1991 - 트리 순회  (0) 2021.06.18