[백준] 랜선 자르기 (1654)(kotlin)

문제 설명

백준 1654번 문제 링크

입력 및 출력

» 입력

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다.

» 출력

첫째 줄에 N개를 만들 수 있는 랜선의 최대 길이를 센티미터 단위의 정수로 출력한다.

예제 입출력(테스트케이스)

입력 출력
4 11
802
743
457
539
200

문제 힌트

802cm 랜선에서 4개, 743cm 랜선에서 3개, 457cm 랜선에서 2개, 539cm 랜선에서 2개를 잘라내 모두 11개를 만들 수 있다.

문제 풀이1

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val (k, n) = readLine().split(" ").map { it.toInt() }
    val cables = mutableListOf<Long>()

    repeat(k) {
        cables.add(readLine().toLong())
    }

    cables.sort()

    var max = cables[k - 1]
    var min = 1L
    var middle = 0L

    while (max >= min) {
        middle = (max + min) / 2

        var count = 0L

        for (i in cables.indices) {
            count += cables[i] / middle
        }

        if (count >= n) min = middle + 1
        else  max = middle - 1
    }
    println(max)
}

Debug1

debug1_image1
debug1_image2
debug1_image3
debug1_image4
debug1_image5
debug1_image6
debug1_image7
debug1_image9