알고리즘/JAVA

[JAVA] 콜라츠 추측 - 프로그래머스

야아옹 2020. 10. 21. 14:59

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

 

1-1 . 입력된 수가 짝수라면 2로 나눕니다. 

1-2 . 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.

2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다

 

이때 1이 되기까지 작업이 몇번 이뤄졌는지 리턴! 단 500 번 반복해도 1이 안되면 -1 반환!

 

제한 사항 : 

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

풀이 : Step 진행 되는것처럼~ Enum 변수 사용법이 다르다!

package com.company;

import java.util.Arrays;

public class CollatzGuess {
    public enum collatz
    {
        Even,
        Odd,
        End
    }
    public static void main(String[] args) {
        System.out.println(solution(6));
        System.out.println(solution(16));
        System.out.println(solution(626331));
    }
    public static int solution(int num) {
        long answer = num;
        int count = 0;

        CollatzGuess.collatz cl;
        if (num == 1) return 0;

        cl = answer % 2 == 0 ? collatz.Even : collatz.Odd;

        while(count <= 500)
        {
            switch (cl)
            {
                case Even:
                {
                    answer = answer / 2;
                    count++;
                    cl = collatz.End;
                    break;
                }
                case Odd:
                {
                    answer = 3 * answer + 1;
                    count++;
                    cl = collatz.End;
                    break;
                }
                case End:
                {
                    if (answer != 1)
                    {
                        cl = answer % 2 == 0 ? collatz.Even : collatz.Odd;
                    }
                    else
                    {
                        return  count;
                    }
                }
            }
        }
        if (count >=500) count = -1;
        return count;
    }
}