알고리즘/C#

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

야아옹 2020. 10. 19. 18:54

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

 

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

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

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

 

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

 

제한 사항 : 

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

풀이 : Step 형식으로 Switch 문을 무한 루프 시켜 안에서 정해진 답이 나오기전까지 Step 을 탈수 있도록 수정!

        Enum 타입을 지정하고 Swtich 를 만들면 자동 생성됨 ㅎ

public enum collatz
{
    Even,
    Odd,
    End,
}

public static int solution(int num)
{
    long answer = num;
    int cnt = 0;
    
    collatz collatz = new collatz();

    if (num == 1) return 0;
    collatz = answer % 2 == 0 ? collatz.Even : collatz.Odd;

    while (true)
    {
        switch (collatz)
        {
            case Solution.collatz.Even:
                {
                    answer = answer / 2;
                    cnt++;
                    collatz = collatz.End;
                    break;
                }

              
            case Solution.collatz.Odd:
                {
                    answer = 3 * answer + 1;
                    cnt++;
                    collatz = collatz.End;
                    break;
                }
               
            case Solution.collatz.End:
                {
                    if (answer != 1)
                        collatz = answer % 2 == 0 ? collatz.Even : collatz.Odd;
                    else if (cnt >= 500)
                    {
                        return -1;
                    }
                        
                    else
                    {
                        return cnt;
                    }

                    break;
                }
            default:
                break;
        }
    }
}