BOJ

BOJ 1715 - 카드 정렬하기

yanJuicy 2024. 8. 6. 12:02
반응형

문제

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
 
= 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