1 이상의 정수가 주어졌을 때 정수의 각 자리별 제곱수의 합을 반복한다. 이 때 최종적으로 1이 될 수 있는 정수이면 true를 반환하고 그렇지 않다면 false를 반환한다. 예를 들어 19는 19 - 82 - 68 - 100 - 1 으로 변환하기 때문에 true를 반환한다. 반면에 2는 2 - 4 - 16 - 37 - 58 - 89 - 145 - 42 - 20 - 4으로 되면서 절대로 1이 되지 않기 때문에 1을 반환한다.
무한 loop를 통해 계속해서 정수를 변환한다. 이 때 이전에 한 번이라도 나온 정수는 메모리에 저장한다. 이 과정 속에서 1이 나오면 true를 반환하고 메모리에 저장된 정수가 나오면 false를 반환한다.
class Solution {
fun isHappy(n: Int): Boolean {
var pre = n
val memory = mutableSetOf(n)
while (true) {
val num = convert(pre)
if (num == 1) return true
else if (memory.contains(num)) return false
memory.add(num)
pre = num
}
}
private fun convert(n: Int) = n.toString().map {
it.digitToInt() * it.digitToInt()
}.sum()
}