[프로그래머스] 콜라츠 수열 만들기

devel_liz·2024년 12월 2일
1

코딩테스트

목록 보기
17/45

🗒 문제



📝 나의 문제풀이

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()
    • Kotlin에서 사용되는 함수로, 주어진 규칙을 바탕으로 무한 혹은 유한한 시퀀스를 생성하는 데 사용됩니다. 이 함수는 초기 값을 제공하고, 그 다음 값을 계산하는 함수를 받아 시퀀스를 생성합니다.
      • initialValue: 시퀀스를 시작하는 초기 값.
      • currentValue -> nextValue: 현재 값에서 다음 값을 계산하는 함수.
        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로 변경해주었더니 다른 테스트 케이스도 통과했다!

profile
Android zizon

0개의 댓글

관련 채용 정보