카테고리 없음

2024-05-01 [Programmers Kotlin 코틀린 콜라츠 추측]

Glen_check 2024. 5. 1. 23:04

CASE (콜라츠 추측)

1937년 Collatz란 사람에 의해 제기된 이 추측은,

주어진 수가 1이 될 때까지 다음 작업을 반복하면 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

 

1-1. 입력된 수가 짝수라면 2로 나눕니다. 
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.

 

EX)

주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다.

위 작업을 몇 번이나 반복해야 하는지 반환하는 함수 solution을 완성해 주세요.

단 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

 

제한 사항

  • 입력된 수, num은 1 이상 8,000,000 미만인 정수입니다.

 

내가 풀어본 문제 풀이

class Solution {
     fun solution(num: Int): Int {
        var answer = 0
        var countTry = 0
        var number = num.toLong()

        while (number != 1L) {
            when {
                number % 2 == 0L -> number /= 2
                number % 2 != 0L -> number = number * 3 + 1
            }
            countTry += 1
        }
        if(countTry > 500) {answer =  -1}
        if (countTry <= 500) {answer =  countTry}
        return answer
    }
}

 

시도횟수를 저장하는 변수 countTry를 변수로 선언하고, 매개 변수 num을 number에 저장하여 while 문 내 위 문제의 조건을 수행했다.

(*number 를 num.toLong() 하여 저장했는지는 글을 읽다보면 알 수 있습니다!)

 

when 문을 활용 짝수일 때(2로 나누어 나머지가 0일 때) 나누기 2를,

홀수일 때 곱하기 3 더하기 1을 하여 1L이 나올때가지 반복문을 돌리고 반복문이 한 번 돌 때마다 시도횟수를 저장했다.

 

결과적으로 모든 조건이 실행되었다.

풀이를 하며 헤맸던 부분이 있는데,

인텔리제이로 시험해보던 중 num 에 626331을 넣었을 때, 500번을 시도해도 1이 되지 않아 -1이 도출되어야 하나,

488이 도출되는 것이다.

 

확인 결과, while 문을 돌던 과정에서 num이 정해진 숫자 범위(Int Type의 범위)를 넘어가는 일이 발생하였고,

때문에 원하는 답안이 도출되지 않는 점을 파악하여 Long Type 으로 변환하여 시도했더니 원하는 답을 도출할 수 있었다.

 

그리고 위 코드를 가독성 좋게 작성해 본 코드가 아래의 코드이다.

class Solution {
    fun solution(num: Int): Int {
        var number = num.toLong()
        var cntTry = 0
        while(number != 1L && cntTry < 500){
            when {
                number % 2 == 0L -> number /= 2
                number % 2 != 0L -> number = number * 3 + 1
            }
            cntTry++
        }
        return if(cntTry == 500) -1 else cntTry
    }
}

 

사실 다른 풀이를 찾아봤을 때, 꼬리 재귀 함수를 활용 하길래 찾아보니 아직은 너무 어려워 주말을 이용해 개념이랑 원리를 무조건 이해해보려 한다.

알고리즘을 풀었을 때 즐거움이란 .. 그리고 처음 마주하는 함수에 대한 두려움이란 ..

 

코틀린은 뭐다 ? 함수형 프로그래밍! 그러니 함수를 많이 알아두는 것도 좋아! 근데 단순히 외우지말고 무조건 이해하고 넘어가려한다.

5월도 화이팅!