Dev/Algorithm

간만의 알고리즘 공부 - 10 (x만큼 간격이 있는 n개의 숫자)

healthyryu 2024. 7. 7. 19:30
문제 설명
함수 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를 사용하지 않더라도 시퀀스가 자동으로 종료됩니다.

단점 :

조건이 복잡할 경우 가독성이 떨어질 수 있습니다.

경우에 따라 추가적인 조건문이 필요할 수 있습니다.

 

 

 

반응형