[프로그래머스][Java] Level

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12943

문제 설명

1937년 Collatz가 만든 이 추측은 주어진 숫자가 1이 될 때까지 다음 연산을 반복하면 모든 숫자가 1이 될 수 있다는 추측입니다. 작업은 다음과 같습니다.

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

예를 들어 주어진 숫자가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1, 즉 1/8이 됩니다. 위의 작업을 몇 번 반복해야 하는지를 반환하는 함수인 솔루션을 완성하십시오. 단, 주어진 숫자가 1이면 0, 1이 아니면 -1을 500번 반복할 때까지 반환한다.

제한

  • 번호를 입력하고, num은 1보다 크고 8,000,000보다 작은 정수입니다.

I/O 예제 결과

6 8일
16 4
626331 -하나

I/O 예시 설명

I/O 예제 #1
문제의 설명과 같습니다.

I/O 예제 #2
16 → 8 → 4 → 2 → 1이 총 4회 1이 됩니다.

I/O 예제 #3
626331은 500회 시도가 1이 되지 않기 때문에 -1을 반환해야 합니다.

접근하다

주어진 조건에 따라 계산을 반복하고 각 반복마다 응답에 반복 횟수를 기록합니다.

그러나 Collatz 추측은 모든 수에 대해 증명되지 않으므로 500번 시도하여도 1에 도달하지 않으면 -1을 반환하는 조건이 있습니다.

또한 주어진 숫자가 1이면 0을 반환하는 조건도 처리합니다.

한 가지 문제는 매개변수의 기본 유형이 int라는 것입니다.

계산 중 정수 범위(-2147483648~2147483647)을 초과하므로 long으로 변경합니다.

암호

class Solution {
    public int solution(long num) {
        int answer = 0;
        while(num!=1){
	        num = (num%2 ==0) ? num/2 : num*3+1;
            answer++;
            if(answer>=500) {
                answer=-1; 
                break;
            }
        }
        return answer;
    }
}