import kotlin.math.pow
fun main() {
val br = System.`in`.bufferedReader()
val n = br.readLine()
val cnt = Array(10) { 0L }
n.indices.forEach { i ->
val num = n.substring(i, i+1).toInt()
val powNum = 10.toDouble().pow(n.length - 1 - i).toLong()
val back = n.substring(i+1, n.length)
val front = n.substring(0, i)
if (back.isNotEmpty()) cnt[num] += back.toLong()
cnt[num] ++
(0 until num).forEach { cnt[it] += powNum }
if (front.isNotEmpty()) (0..9).forEach { cnt[it] += front.toLong() * powNum }
cnt[0] -= powNum
}
val sb = StringBuilder()
cnt.forEach { sb.append("$it ") }
println(sb)
}
N의 0번 인덱스부터 하나씩 이동하면서
앞, 뒤에 있는 숫자로 부터 해당 인덱스에서 숫자가 몇번 반복되는지 알아낼 수 있습니다.
"458231"가 주워졌을 때,
인덱스 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
Char | 4 | 5 | 8 | 2 | 3 | 1 |
0번 인덱스에서
'4'는 뒤에있는 수만큼 58232(0 ~ 58231)번 반복되고
'1'~'3'은 100000번 반복이 된다는 것을 알 수 있습니다.
이와 같은 방법으로,
3번 인덱스에서 '2'은 31번, '0'~'1'는 100번씩 반복됩니다.
또한 앞에있는 수인 458(0 ~ 457)번만큼 '0'~'9'가 100번씩 반복이 되는데
앞에있는 수가 0인 경우 3번 인덱스의 '0'은 카운트하면 안되기 때문에 빼줘야 됩니다.