반응형
SMALL
https://programmers.co.kr/learn/courses/30/lessons/12943
- 간단하다고 생각하고 코드 작성 후 코드를 실행해보니 500번 이상 케이스에서 틀린 답이 나왔다.
- 이유를 모르겠어서 검색해본 결과 오답의 뚜렷한 원인이 있었다.
- int 가 아닌 long!
- 처음에는 num 값을 주어진 그대로 int로 사용했다.
- 그러나 문제에서 주어진 제한사항에 따라 입력된 수 num 은 1 이상 8000000 미만인 정수이다.
- 만약 연속된 홀수의 경우 최소 3번 3을 연속해서 곱한다해도 int 의 값 범위를 초과한다!
- 이게 바로 원인
- 자료형 값의 범위
byte | -128 ~ 127 |
short | -32768 ~ 32767 |
int | -2147483648 ~ 2147483647 |
long | -9223372036854775808 ~ 9223372036854775807 |
class Solution {
public int solution(int num) {
int answer = 0;
/* 중요 */
long longNum = num; // long이어야 함! 이유는?
while(longNum != 1) {
if(longNum % 2 == 0) {
longNum /= 2;
} else {
longNum = longNum*3 + 1; // 만약 int고 num이 가질 수 있는 최대 큰 수라면 3을 곱했을 때 int 범위를 초과하기 때문에 오답 발생
}
answer++;
if(answer == 501) {
return -1;
}
}
return answer;
}
}
반응형
LIST
'JAVA > Algorithm' 카테고리의 다른 글
[프로그래머스/java] 핸드폰 번호 가리기 (0) | 2020.12.12 |
---|---|
[프로그래머스/java] 하샤드 수 (숫자 자릿수 각각 더하기) (0) | 2020.12.11 |
[프로그래머스/java] 키패드 누르기 (2020 카카오 인턴십) (0) | 2020.12.02 |
[프로그래머스/java] 제일 작은 수 제거하기 (0) | 2020.12.02 |
[프로그래머스/java] 정수 제곱근 판별 (0) | 2020.12.02 |