👀 문제
https://programmers.co.kr/learn/courses/30/lessons/12943
👊 도전
1. 설계
- num이 짝수라면 2로 나누고 홀수라면 3을 곱하고 1을 더한다.
- 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. 설명
- num계산값을 넣을 long타입 변수를 선언한다.
    - num은 8,000,000미만 정수이지만 num*3+1을 반복하는 과정에서 충분히 int형을 초과할 수 있다. 따라서 int보다 큰 long타입을 선언하여 오버플로우가 발생하지 않게 한다.
 
- 결과값이 1이 될 때까지 반복하되 500번을 넘어가면 -1을 리턴한다.
👏 해결 완료!
long타입으로 형변환이 필요하다는게 포인트인 것 같다. 근데 int와 long타입 모두 정수 범위는 같은데 왜 long이 더 큰 데이터를 받을 수 있는지 모르겠다. 대충 OS, 컴파일러에 따라 int의 비트 크기가 다르기 때문이라는데 무슨 말인지 일도 모르겠다T.T