문제

1937년 Collatz란 사람에 의해 제기된 이 추측은, 입력된 수가 짝수라면 2로 나누고, 홀수라면 3을 곱하고 1을 더한 다음, 결과로 나온 수에 같은 작업을 1이 될 때까지 반복할 경우 모든 수가 1이 된다는 추측입니다.
예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. collatz 함수를 만들어 입력된 수가 몇 번 만에 1이 되는지 반환해 주세요. 단, 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

풀이 1

class Collatz {
	public int collatz(int n) {
        int answer = 0;
        long num = (long) n;

        while(answer < 500){
          num = (num%2 == 0) ? num/2 : num*3+1;
          answer++;
          if(num == 1) return answer;
        }

        return -1;
	}

	// 아래는 테스트로 출력해 보기 위한 코드입니다.
	public static void main(String[] args) {
		Collatz c = new Collatz();
		int ex = 6;
		System.out.println(c.collatz(ex));
	}
}

분명히 제대로 한 거 같은데 테스트 코드를 돌리면 계속 오류가 났었다. 하다하다 안되길래 다른 사람 풀이를 보니 num 변수를 int가 아닌, long 타입으로 잡아주니 정상적으로 나왔다. 아마 int 값을 벗어난 수가 파라미터로 들어오는 경우가 있어서 그런 듯 하다.

풀이 2

class Collatz {
    public int collatz(int num) {
        long n = (long)num;
        for(int i =0; i<500; i++){      
            if(n==1) return i;
            n = (n%2==0) ? n/2 : n*3+1;            
        }
        return -1;
    }
    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void main(String[] args) {
        Collatz c = new Collatz();
        int ex = 6;
        System.out.println(c.collatz(ex));
    }
}

내가 푼 방식과 비슷하다. 단지 while문을 for로 바꿔썼다는 정도?