알고리즘
bj1715(카드 정렬하기)-그리디
쥐4
2025. 4. 10. 15:14
https://www.acmicpc.net/problem/1715
카드를 정렬한다.
이 문제의 그리디 전략은
작은 카드 묶음이 더 많이 나오게 하는 것이었다.
즉, 가장 작은 카드 묶음부터 더한다.
중간에 만들어진 카드 묶음보다 더 작은 카드 묶음이 있을 수 있기 때문에, PriorityQueue를 이용해 정렬된 상태를 유지해준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class Main {
/**
* 100000000
* N개의 카드 묶음
* 그리디 전략1 : 큰 카드 묶음이 덜 나오게 해야 한다.
* 그리디 전략2 : 작은 카드 묶음이 많이 나오게 해야한다.
* 즉, 가장 작은 카드묶음부터 더하면 될 것 같다.
* priorityqueue에다가 새로 만들어진 카드 묶음을 넣는다.
*/
static int N;
static PriorityQueue<Integer> queue = new PriorityQueue<>(((o1, o2) -> (o1-o2)));
static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
initialize();
if(queue.size() == 1){
System.out.println(0);
}else{
System.out.println(solve());
}
}
private static int solve() {
int answer = 0;
while(queue.size() != 1){
int temp = queue.poll() + queue.poll();
answer += temp;
queue.add(temp);
}
return answer;
}
private static void initialize() throws IOException {
N = Integer.parseInt(bufferedReader.readLine());
for(int i = 0; i < N; i++){
queue.add(Integer.parseInt(bufferedReader.readLine()));
}
}
}