https://www.acmicpc.net/problem/1715
1715번: 카드 정렬하기
정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장
www.acmicpc.net
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 1 <= N <= 100,000
// 1 < = size_card <= 1,000
int N = Integer.parseInt(br.readLine());
// ArrayList<Integer> size_cards = new ArrayList<>();
PriorityQueue<Integer> size_cards = new PriorityQueue<>();
for (int i = 0; i < N; i++) {
size_cards.add(Integer.parseInt(br.readLine()));
}
int answer = 0;
while (size_cards.size() != 1) {
int a = size_cards.remove();
int b = size_cards.remove();
answer += a + b;
size_cards.add(a + b);
}
bw.write(answer + "\n");
bw.flush();
bw.close();
}
}
합이 최소가 되어야 하므로 결국 합을 하는 각각이 최소가 되어야 한다
실패)
자료구조를 ArrayList로 설정하여 index 0 1 제거 후 값 추가 후 정렬
while 문장이 O(N * NlogN) 이 걸렸다
성공)
자료구조를 우선순위 큐로 변경하고 삭제와 삽입이 logN이므로
O(NlogN)으로 해결
왜 쓸 수 있냐?
항상 최솟값 2개를 구해서 덧셈 후 자료구조에 넣어줘야 하는 시스템이다