Skip to content

Commit a96d456

Browse files
committed
[BOJ] 카드 정렬하기 / 골드 4 / 30분
https://www.acmicpc.net/problem/1715
1 parent 2ccfa8a commit a96d456

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'''
2+
요구사항
3+
1. 매우 많은 숫자 카드 묶음이 책상 위에 놓여 있다. 이들을 두 묶음씩 골라 서로 합쳐나갈 때, 최소한 몇 번의 비교가 필요한지를 계산
4+
5+
1. 아이디어
6+
- A개, B개 두 묶음의 카드를 비교하는데 A+B번 비교해야 함.
7+
- 비교한 횟수를 누적시켜 최소값을 찾아야 하므로 비교횟수가 가장 작은 것들부터 시작해야 함.
8+
- A, B, C 3개의 카드 묶음이 있고 A < B < C라면, (A+B) + ((A+B) + C)가 최소값이다.
9+
10+
2. 시간복잡도
11+
- (1 ≤ N ≤ 100,000)
12+
- O(N + (N-1) * logN), 대략 O(NlogN)으로 시간복잡도 만족.
13+
14+
3. 구현
15+
3.1 입력받기
16+
3.2 카드 묶음 정렬(우선순위 큐에 저장)
17+
3.3 가장 카드가 적은 묶음 2개를 뽑아 더한 값을 정답변수에 누적시키고 다시 우선순위큐에 저장
18+
3.4 우선순위 큐가 하나 남을때까지 반복
19+
3.5 정답 출력
20+
'''
21+
22+
import sys
23+
import heapq
24+
25+
inp = sys.stdin.readline
26+
27+
N = int(inp().strip())
28+
arr = []
29+
answer = 0
30+
31+
for _ in range(N):
32+
arr.append(int(inp().strip()))
33+
34+
# 매번 최소 카드 묶음 2개를 뽑기 위해 heap 사용
35+
heapq.heapify(arr)
36+
37+
while len(arr) > 1:
38+
min1 = heapq.heappop(arr)
39+
min2 = heapq.heappop(arr)
40+
41+
answer += min1 + min2
42+
heapq.heappush(arr, min1 + min2)
43+
44+
print(answer)

0 commit comments

Comments
 (0)