[백준] 등수 구하기 (1205)(kotlin)

문제 설명

백준 1205번 문제 링크

입력 및 출력

» 입력

첫째 줄에 N, 송유진의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보다 작거나 같은 자연수 또는 0이다. 둘째 줄에는 현재 랭킹 리스트에 있는 점수가 비오름차순으로 주어진다. 둘째 줄은 N이 0보다 큰 경우에만 주어진다.

» 출력

첫째 줄에 문제의 정답을 출력한다.

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

입력 출력
3 90 10
100 90 80
2
10 1 10
10 9 8 7 6 5 4 3 2 1
-1

문제 풀이1

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val (n, song, p) = readLine().split(" ").map { it.toInt() }
    var chart: List<Int>? = null

    if (n != 0) chart = readLine().split(" ").map { it.toInt() }.toMutableList()
    else {
        println(1)
        return
    }

    if (chart.size >= p) {
        if (chart.minOf { it } < song) {
            chart.add(song)
            println(findRank(chart.sortedDescending(), song))
        } else {
            println(-1)
        }
    } else {
        chart.add(song)
        println(findRank(chart.sortedDescending(), song))
    }
}

fun findRank(chart: List<Int>, target: Int): Int {
    var prev = -1
    var rank = 0
    var count = 1

    for (i in chart) {
        if (i != prev) {
            rank = count
            prev = i
        }

        if (i == target) return rank

        count++
    }

    return rank
}

문제 풀이2

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

    if (n == 0) {
        println(1)
        return
    }

    val chart = readLine().split(" ").map { it.toInt() }
    val rank = chart.count { it > song } + 1
    val count = chart.count { it >= song } + 1

    println(if (count <= p) rank else -1)
}


//e.g.
// input
// 5 3 5
// 5 3 3 3 1
// rank -> 2
// count -> 5
// println( if (5 <= 5) 2 else -1 )

// input
// 5 3 4
// 5 3 3 3 1
// rank -> 2
// count -> 5
// println( if ( 5 <= 4) rank else -1 )