[백준] 한 줄로 서기 (1138)(kotlin)
문제 설명
입력 및 출력
» 입력
첫째 줄에 사람의 수 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