반응형
문제
https://www.acmicpc.net/problem/1715
풀이
오름차순으로 정렬해서 더하면 되는 그리디 문제다
이때 주의할 점은 작은 수끼리 더한 값도 다시 리스트에 넣어서 오름차순으로 정렬해야 한다
우선순위 큐를 이용하면 최소값을 O(1) 시간 만에 찾을 수 있고, 오름차순으로 정렬하는 데 O(log n) 만큼 걸리므로 문제를 해결할 수 있다
코드
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import sys
import heapq
heap = []
sum = 0
n = int(sys.stdin.readline())
for _ in range(n):
card_size = int(sys.stdin.readline())
heapq.heappush(heap, card_size)
while len(heap) > 1:
a = heapq.heappop(heap)
b = heapq.heappop(heap)
sum += a + b
heapq.heappush(heap, a + b)
print(sum)
|
cs |
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class Main {
private static int n;
private static PriorityQueue<Integer> pq = new PriorityQueue<>();
public static void main(String[] args) throws IOException {
input();
solve();
}
private static void solve() {
int sum = 0;
while (pq.size() != 1) {
int a = pq.poll();
int b = pq.poll();
sum += a + b;
pq.add(a + b);
}
System.out.println(sum);
}
private static void input() throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(bufferedReader.readLine());
for (int i = 0; i < n; i++) {
pq.add(Integer.parseInt(bufferedReader.readLine()));
}
}
}
|
cs |
반응형
'BOJ' 카테고리의 다른 글
BOJ 1018 - 체스판 다시 칠하기 (0) | 2024.08.24 |
---|---|
BOJ 10872 - 팩토리얼 (0) | 2024.08.14 |
백준 11279 - 최대 힙 (0) | 2024.08.02 |
BOJ 10799 - 쇠막대기 (0) | 2024.07.15 |
BOJ 1158 - 요세푸스 문제 (1) | 2024.01.28 |