[JAVA/프로그래머스] 연습문제: 콜라츠 추측

👀 문제

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

👊 도전

1. 설계

  1. num이 짝수라면 2로 나누고 홀수라면 3을 곱하고 1을 더한다.
  2. 500안에 num이 1이 되면 횟수를 리턴, 안된다면 -1을 리턴한다.

2. 구현 (성공 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 *
 * @author HEESOO
 *
 */
 class Solution {
   public int solution(int num) {
       int answer = 0;
       long number=(long)num;
       while(number!=1){
           if(answer==500)
               return -1;
           number= number%2==0 ? number/2 : 3*number+1;
           answer++;
       }
       return answer;
   }
 }
 

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. num계산값을 넣을 long타입 변수를 선언한다.
    • num은 8,000,000미만 정수이지만 num*3+1을 반복하는 과정에서 충분히 int형을 초과할 수 있다. 따라서 int보다 큰 long타입을 선언하여 오버플로우가 발생하지 않게 한다.
  2. 결과값이 1이 될 때까지 반복하되 500번을 넘어가면 -1을 리턴한다.

👏 해결 완료!

long타입으로 형변환이 필요하다는게 포인트인 것 같다. 근데 int와 long타입 모두 정수 범위는 같은데 왜 long이 더 큰 데이터를 받을 수 있는지 모르겠다. 대충 OS, 컴파일러에 따라 int의 비트 크기가 다르기 때문이라는데 무슨 말인지 일도 모르겠다T.T