문제 설명
함수 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를 사용하지 않더라도 시퀀스가 자동으로 종료됩니다.
단점 :
• 조건이 복잡할 경우 가독성이 떨어질 수 있습니다.
• 경우에 따라 추가적인 조건문이 필요할 수 있습니다.
'Dev > Algorithm' 카테고리의 다른 글
간만의 알고리즘 공부 - 12 (귤 고르기) (1) | 2024.07.09 |
---|---|
간만의 알고리즘 공부 - 11 (나머지가 1이 되는 수 찾기) (0) | 2024.07.08 |
간만의 알고리즘 공부 - 9 (멀리 뛰기 | 피보나치 수열) (0) | 2024.07.06 |
간만의 알고리즘 공부 - 8 (하샤드 수) (0) | 2024.07.06 |
간만의 알고리즘 공부 - 7 (두 정수 사이의 합 | 등차수열의 합) (0) | 2024.07.05 |