👀 문제
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