어떤 수의 합이나 차 연산을 수행할때는 보기 쉽지 않은 문제이지만, 곱이나 나누기가 들어가면 관련된 문제가 종종 발생하는데, 프로그래머스 코딩 테스트 연습 문제 중 콜라츠 추측 문제가 있다.
변경 전
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에 넣어주었더니 문제를 해결할 수 있었다.