40분
package 백준.Platinum.P3.p16877_핌버
const val MAX_P = 3000000
fun main() {
val fibonacci = mutableListOf(1, 1)
while (fibonacci.last() < MAX_P) {
fibonacci.add(fibonacci.last() + fibonacci[fibonacci.size - 2])
}
val G = IntArray(MAX_P + 1)
val selected = BooleanArray(fibonacci.size)
for (i in 1..MAX_P) {
selected.fill(false)
for (num in fibonacci) {
if (i - num < 0) break
selected[G[i - num]] = true
}
G[i] = selected.indexOf(false)
}
val N = readln().toInt()
val result = readln().split(" ").map(String::toInt).fold(0) { acc, i -> acc xor G[i] }
println(if (result != 0) "koosaga" else "cubelover")
}
https://www.acmicpc.net/problem/16877
시간 초과가 떠서 어떻게 시간을 줄일까 많은 고민을 하였다. mex값을 구할 때 사용하는 Boolean배열의 크기가 아무리 커도 fibonacci배열의 크기보다 클 필요가 없다는 것을 깨달았다.