Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/1715

 

1715번: 카드 정렬하기

정렬된 두 묶음의 숫자 카드가 있다고 하자. 각 묶음의 카드의 수를 A, B라 하면 보통 두 묶음을 합쳐서 하나로 만드는 데에는 A+B 번의 비교를 해야 한다. 이를테면, 20장의 숫자 카드 묶음과 30장

www.acmicpc.net

 

난이도 : 골드 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)
}

 

 

 

후기

매번 최적의 해(가장 작은 값 두 개)를 선택하는 그리디 알고리즘 입니다.

두 개의 카드를 선택해 합치고, 매번 정렬하여 가장 작은 값 두 개를 찾아야 하나 싶었는데,

우선순위 큐를 이용하면 꽤 쉽겠다 생각하여 우선순위 큐를 사용해 풀이하였습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.