알고리즘/프로그래머스

콜라츠 추측(JAVA)

mrban 2022. 1. 19. 16:40

1. 문제

콜라츠 추측은 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측이다. 

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

예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 된다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수를 만드시오. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환하시오.

 

2. 제한
입력된 수, num은 1 이상 8000000 미만인 정수입니다.

 

3. 정답
class Solution {
    public int solution(int num) {
        int count = 0;
        long temp = (long)num;

        while ((temp != 1) && (count != 500)) {
            if(temp % 2 == 0) {
                temp /= 2;
            }
            else {
                temp = temp * 3 + 1;
            }
            count++;
        }
        if (temp != 1) {
            return -1;
        }
        else {
            return count;
        }
    }
}
 

4. 설명

4-1. 작업들중에서 짝수인 경우 3을 곱하는 과정이 있는데 그 과정에서 오버플로우가 발생할 수 있기 때문에 num을 long형변환해준 temp변수를 만들어준다.

4-2. 짝수이면 2로 나누고 홀수이면 3을 곱한뒤 1을 더해주는 반복 작업을 temp가 1이 아니고 count(횟수)가 500번이 되기 전까지 반복합니다.

4-3. 반복문을 다 돌고 나왔는데 temp가 1이 아니라면 500번만에 1이 되지 못한 경우이므로 -1을 return한다.

4-4. 위와 같은 경우가 아니라면 temp가 1이 된 것이므로 작업 횟수 count를 return한다.