콜라츠 추측

김나영·2023년 6월 17일
0

프로그래머스

목록 보기
2/39

문제 : 콜라츠 추측

풀이

public int solution(int num2) {
        int answer = 0;
        long num = (long)num2;
  • long 타입으로 형변환을 하지 않으면 int범위를 초과하는 경우가 발생

  • num이 int일 경우 연산 과정에서 int의 최대값(약 21억)을 초과하게 되어, 음수가 출력됨

     while(num != 1) {
       if (num%2 == 0) {
           num = num/2;
       }else {
           num = (num * 3) + 1;
       }
       answer++;
  • while문으로 1이 아닐 때까지 반복하면서 작업 횟수(answer)를 늘려줌

  • 이 때 입력된 수가 짝수라면 2로 나눔

  • 이 때 결과로 나온 값을 num에다 저장해줌

  • 그게 아니라면(홀수라면) 3을 곱하고 1일 더한 값을 num에 저장함

num = (num%2 ==0)? num/2 : (num*3)+1;
answer++;
  • 삼항 연산자로도 가능

  • 짝수이면 2로 나누고 그게 아니라면 3을 곱한 후 1을 더함

  • 그 값을 num에 저장하고 작업 횟수를 증가시킴

if (answer >= 500) {
    answer = -1;
    break;
  • 작업이 500번보다 크거나 같게 되면 break를 걸어 -1을 리턴하게 만듦

전체 코드

class Solution {
    public int solution(int num2) {
        int answer = 0;
        long num = (long)num2;
         while(num != 1) {
            if (num%2 == 0) {
                num = num/2;
            }else {
                num = (num * 3) + 1;
            }
            answer++;
            if (answer >= 500) {
                answer = -1;
                break;
            }
        }
        return answer;
    }
}

문제 발생

  • 코드 실행 도중 케이스 3에서 -1이 아니라 488이 출력됨

해결 방안

  • int num을 long 타입으로 형변환 진행

추가로 int의 최대값(약 21억)을 초과하게 되면 음수로 출력이 된다고 함.

0개의 댓글