[백준] 한 줄로 서기 (1138)(kotlin)

문제 설명

백준 1138번 문제 링크

입력 및 출력

» 입력

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다.

» 출력

첫째 줄에 줄을 선 순서대로 키를 출력한다.

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

입력 출력
4
2 1 1 0
4 2 1 3
5
2 1 0 1 0
3 2 1 5 4

문제 풀이1

import java.util.PriorityQueue

class Person(val ahead: Int, val height: Int): Comparable<Person> {
    override fun compareTo(other: Person): Int = if (this.ahead == other.ahead) other.height - this.height
        else this.ahead - other.ahead
}

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val n = readLine().toInt()
    val ans = IntArray(n)
    val q = PriorityQueue<Person>()

    readLine()
        .split(" ")
        .map { it.toInt() }
        .forEachIndexed { index, ahead ->
            q.add(Person(ahead, index + 1))
        }

    val max = q.poll()
    ans[max.ahead] = max.height

    while (q.isNotEmpty()) {
        val current = q.poll()
        var move = current.height

        for (i in 0 until n) {
            if (ans[i] == 0) {
                ans[i] = move
                break
            }
            else {
                var count = 0
                var jdx = 0
                for (j in 0 until n) {
                    if (count == current.ahead) {
                        jdx = j
                        break
                    }
                    if (ans[j] > move) count++
                }

                for (j in jdx until n) {
                    if (ans[j] == 0) {
                        ans[j] = move
                        break
                    }
                    else {
                        val temp = ans[j]
                        ans[j] = move
                        move = temp
                    }
                }
                break
            }
        }
    }

    println(ans.joinToString(" "))
}

Debug1

debug1_image1 debug1_image2