https://www.acmicpc.net/problem/1715
난이도 : 골드 4
태그 : 자료 구조, 그리디 알고리즘, 우선순위 큐
설명
비교 횟수가 최소가 되려면
매번 가장 작은 개수의 카드 묶음 두개씩 비교하여 합치면 됩니다.
매번 정렬하여 가장 작은 값 두개를 찾을 필요 없이,
우선순위 큐를 사용하면 쉽게 구할 수 있습니다.
소스코드
import java.util.PriorityQueue
fun main() {
val br = System.`in`.bufferedReader()
val n = br.readLine().toInt()
val cards = PriorityQueue<Int>()
repeat(n) {
cards.add(br.readLine().toInt())
}
var total = 0
while (cards.isNotEmpty()) {
// 큐에서 카드 하나 꺼냄
val a = cards.poll()
// 큐가 비어있지 않으면 카드를 하나 더 꺼내서 비교함
if (cards.isNotEmpty()) {
val sum = a + cards.poll()
total += sum
cards.add(sum)
}
}
println(total)
}
후기
매번 최적의 해(가장 작은 값 두 개)를 선택하는 그리디 알고리즘 입니다.
두 개의 카드를 선택해 합치고, 매번 정렬하여 가장 작은 값 두 개를 찾아야 하나 싶었는데,
우선순위 큐를 이용하면 꽤 쉽겠다 생각하여 우선순위 큐를 사용해 풀이하였습니다.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 25965번] [Kotlin] 미션 도네이션 (0) | 2022.11.15 |
---|---|
[백준 1202번] [Kotlin] 보석 도둑 (0) | 2022.11.13 |
[백준 12100번] [Kotlin] 2048 (Easy) (0) | 2022.11.10 |
[백준 1431번] [Kotlin] 시리얼 번호 (0) | 2022.11.09 |
[백준 10825번] [Kotlin] 국영수 (0) | 2022.11.09 |