1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.
습관대로 for문을 사용, iterator 범위를 1에서 500까지로 하고 문제를 전개하다가 while을 사용하는 게 더 효율적이라는 생각이 들었다. 조건문에는 주어진 num이 1이 아니면서 반복 횟수인 cnt가 500 이하인 경우만 참으로 인정, 작업을 수행할 수 있도록 했다.
그리고 수행문 안으로 진입 시 cnt +1 해준 다음, 짝수일 때와 홀수일 때를 나누어 처리했다. 변수 cnt는 0으로 초기화 해 만약 주어진 num이 1이라 while문에 진입하지 못하고 바로 return으로 향할 시 0이 반환되게 했고, 삼항 연산자를 활용해 작업 횟수가 500번을 초과해 num이 1이 되지 못한 경우엔 -1이 반환되도록 했다.
class Solution {
public int solution(int num) {
int cnt = 0;
while(num != 1 && cnt <= 500){
++cnt;
if(num%2 == 0){
num /= 2;
}else if(num%2 == 1){
num = (num * 3) + 1;
}
}
return (num == 1) ? cnt : -1;
}
}
