JAVA/Algorithm

[프로그래머스/java] 콜라츠 추측 (+ 오답 이유 (feat.자료형범위))

nang. 2020. 12. 10. 23:03
반응형
SMALL

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

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

 

  • 간단하다고 생각하고 코드 작성 후 코드를 실행해보니 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