20231219 TIL

JaeYeong·2023년 12월 19일

코딩 테스트를 풀면서 : 자료형이 바뀌는 경우

수를 계산하는 로직에 따라

어떤 수의 합이나 차 연산을 수행할때는 보기 쉽지 않은 문제이지만, 곱이나 나누기가 들어가면 관련된 문제가 종종 발생하는데, 프로그래머스 코딩 테스트 연습 문제 중 콜라츠 추측 문제가 있다.

변경 전

fun solution(num: Int): Int {
    var i = 0
    var x = num
    while(i<=500) {
        if (x%2==0) {
            x /=2
            i++
        }
        else if (x==1) {
            break
        }
        else {
            x = 3*x + 1
            i++
        }
    }
    return if (i<=500) {
        i
    }
    else {
        -1
    }
}

이대로 실행하게 되면 프로그래머스에서 추가한 테스트 케이스 중 626331을 대입한 경우에는, 기댓값이 488이 나와 의도한 기댓값 -1과 다르게 나온다.

왜 그렇게 나왔을까?

변수 x에 곱연산이 들어갔기 때문인데, 이 때문에 Int 자료형으로는 커버할 수 없는 수가 x에 대입되어 생기는 문제로 보인다. 그렇다면 중간에 변수 x를 더 큰 자료형으로 변환해줘야 할 것 같다.

수의 변환을 잘 사용하려면

뭔가 애매하다 싶으면, 매개변수를 이용해서 x의 값을 대입해주는 방식으로 자료형을 변환하였다.
변경 후

fun solution(num: Int): Int {
    var i = 0
    var x = num
    while(i<=500) {
        if (x%2==0) {
            x /=2
            i++
        }
        else if (x==1) {
            break
        }
        else {
            var k = x.toDouble()
            k = 3*k + 1
            x=k.toInt()
            i++
        }
    }
    return if (i<=500) {
        i
    }
    else {
        -1
    }
}

위와 같이 매개변수 k를 정의하고 매개변수를 통해 연산을 수행한 후, 매개변수의 값을 변환하여 x에 넣어주었더니 문제를 해결할 수 있었다.

0개의 댓글