class Solution {
fun solution(n: Int): IntArray {
val list = mutableListOf<Int>(n)
var x = n
while(x != 1){
x = if(x % 2 == 0) x / 2 else 3 * x + 1
list.add(x)
}
return list.toIntArray()
}
}
class Solution {
fun solution(n: Int): List<Int> {
return generateSequence(n) { if (it == 1) null else if (it % 2 == 0) it / 2 else 3 * it + 1 }.toList()
}
}
generateSequence(initialValue) { currentValue -> nextValue }
val sequence = generateSequence(1) { it * 2 }
println(sequence.take(5).toList()) // [1, 2, 4, 8, 16]
위 코드는 1부터 시작하여, 각 항목이 이전 값의 두 배가 되는 무한 시퀀스를 생성합니다. take(5)로 처음 5개 항목만 추출합니다.val sequence = generateSequence(1) { if (it < 10) it + 1 else null }
println(sequence.toList()) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
null
을 반환하면 시퀀스 생성이 종료됩니다. 이 예시에서는 1부터 시작해 10까지 생성된 후 종료됩니다.
- 무한 시퀀스: generateSequence()는 종료 조건이 없으면 무한 시퀀스를 생성할 수 있습니다.
- 유한 시퀀스: 종료 조건을 null로 설정하여 유한한 시퀀스를 만들 수 있습니다.
generateSequence()는 주로 연속적인 값들이나 규칙적인 값들을 생성할 때 유용하게 사용됩니다.
이번 문제는 사용된 함수가 어렵기보다는 문제 자체가 이해가 잘되질 않았다. while문에 제한 사항 그대로 it >= 1 || it <= 1000
해주었을 때 x 1이 포함되지 않아 it > 1 || it <= 1000
로 변경하였다. 그리고 제출하였더니 다른 케이스에서 정답이 맞지 않는다는 문제가 발생했다. 그래서 뭐지?? 싶어 문제를 다시 들여다봤다.
결국 언젠가는 1에 도달한다는 것이고 x가 1이 되는지 묻는 문제라는 힌트를 얻고 범위는 함정일 수 있겠구나 생각하여 조건문을 x != 1
로 변경해주었더니 다른 테스트 케이스도 통과했다!