간만의 알고리즘 공부 - 10 (x만큼 간격이 있는 n개의 숫자)
문제 설명
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
제한 사항
- x는 -10000000 이상, 10000000 이하인 정수입니다.
- n은 1000 이하인 자연수입니다.
내가 푼 방법
fun solution(x: Int, n: Int): LongArray {
return LongArray(n) { i -> ((i + 1) * x).toLong()}
}
위와 같이 코드를 작성하니 테스트 케이스를 전부 통과하지 못했다. 일단 처음에는 무슨 문제인지 이해하지 못했다.
그래서 IDE 에서 이런 저런 케이스를 테스트해보다가 "(i+1) * x" 값이 정수를 벗어날 경우가 생긴경우를 생각하지 못했다. (i+1) * x 값이 나오면 Long 처리를 해주면 된다고 생각했는데 이미 값이 정수를 벗어낫기에 예상치 못한 값이 나왔다.
내가 푼 방법 2
fun solution(x: Int, n: Int): LongArray {
return LongArray(n) { i -> ((i + 1) * x.toLong())}
}
코드 첨삭
fun solution(x: Int, n: Int): LongArray {
return generateSequence(x.toLong()) { it + x }
.take(n)
.toList()
.toLongArray()
}
Kotlin 특성을 활용해서 조금 더 간결하고 명확하게 하는 방법이다.
추가적으로 generateSequence() 는 무한하게 생성하는 무한 시퀀스이기 때문에 사용할때 take() 혹은 generateSequence() { /* 조건문 */} 방법으로 개수를 제한할 수 있다. 각 방법의 장단점은 아래와 같다
val sequence = generateSequence(x.toLong()) { it + 1 }.take(100)
장점 :
• 간단하고 직관적입니다.
• 무한 시퀀스를 생성하고, take(100)를 통해 처음 100개의 값만 가져오기 때문에 쉽게 이해할 수 있습니다.
단점 :
• 무한 시퀀스를 생성하기 때문에, take(100)를 사용하지 않으면 무한히 실행될 수 있습니다.
• 종료 조건이 없기 때문에 시퀀스의 전체 길이를 정확히 알기 어렵습니다.
val sequence = generateSequence(x.toLong()) { if (it <= 100) it + 1 else null }
장점 :
• 종료 조건을 명시적으로 포함하기 때문에, 시퀀스가 언제 끝날지 명확합니다.
• take를 사용하지 않더라도 시퀀스가 자동으로 종료됩니다.
단점 :
• 조건이 복잡할 경우 가독성이 떨어질 수 있습니다.
• 경우에 따라 추가적인 조건문이 필요할 수 있습니다.