백준 13975번 파일 합치기3 (JAVA)
난이도
- 골드 4
알고리즘 분류
- 자료구조
- 그리디 알고리즘
- 우선순위 큐
풀이
모든 파일이 합쳐지는 동안 최초 두 파일을 합치는 경우의 비용은 누적된다.
누적되는 비용의 최소화 필요
가장 작은 비용의 두 파일을 합치고 하나의 파일로 연산한다.
코드
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(in.readLine());
for(int t = 0; t < T; t++) { // 테스트케이스의 개수만큼 반복
int K = Integer.parseInt(in.readLine());
PriorityQueue<Long> pq = new PriorityQueue<>(); // 우선순위 큐를 활용하여 최소 비용이 드는 두 파일을 찾는다.
StringTokenizer st = new StringTokenizer(in.readLine());
for(int i = 0; i < K; i++) {
pq.offer(Long.parseLong(st.nextToken())); // 초기 상태 우선순위 큐 삽입
}
long answer = 0;
while(pq.size() > 1) { // 파일이 1개만 남는 경우는 모든 파일을 합친 상태
long a = pq.poll(); // 최소 비용을 만드는 가장 작은 파일 1
long b = pq.poll(); // 최소 비용을 만드는 가장 작은 파일 2
long sum = a + b; // 두 파일을 합치는 비용
answer += sum; // 비용 누적
pq.offer(sum); // 합쳐진 새로운 하나의 파일을 다시 우선순위 큐에 삽입
}
sb.append(answer).append("\n");
}
out.write(sb.toString());
out.close();
}
}
'Coding Test > Baekjoon' 카테고리의 다른 글
백준 14889번 스타트와 링크(JAVA) (0) | 2022.09.27 |
---|---|
백준 21578번 꿀 따기 (JAVA) (1) | 2022.09.22 |
백준 17204번 죽음의 게임 (JAVA) (1) | 2022.09.21 |
백준 2922번 크면서 작은 수 (JAVA) (0) | 2022.09.21 |
백준 1722번 순열의 순서 (JAVA) (0) | 2022.09.12 |