[프로그래머스] 콜라츠 추측-JAVA

말하는 감자·2022년 5월 9일
1

Programmers Level 1

목록 보기
7/66
post-thumbnail

프로그래머스 Level 1

🔒 콜라츠 추측

📚 문제 설명

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

1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.

예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수, solution을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.


✅ 제한 사항

  • 입력된 수, num은 1 이상 8000000 미만인 정수입니다.

📖 입출력 예

nresult
68
164
626331-1

📃 입출력 예 설명

입출력 예 #1
문제의 설명과 같습니다.

입출력 예 #2
16 -> 8 -> 4 -> 2 -> 1 이되어 총 4번만에 1이 됩니다.

입출력 예 #3
626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야합니다.


🔨 첫번째 작성 코드

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

아 너무 쉽다 쉬워~😙 하고 돌렸는데?!

🌺488이 왜 거기서 나와...?🌸

그래서 질문하기를 들어가보니

감자만 그런 게 아니였어!🤣

❗️ 테스트 케이스 3번의 값인 626331을 계산할 때 숫자가 너무 커지고 커져서 489번째에서 int의 최대치를 넘어가버린 것❗️

이제 원인을 알았으니 수정해보자!!


🗝️ 두번째 작성 코드

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

매개 변수를 int에서 long으로만 변경했을 뿐인데 통과되었다.

역시 내 새끼는 잘못 없었어!!❤️
내 새끼가 최고야!!❤️❤️


😒 느낀 점

적어도 기본적으로 제공되는 코드에서는 오류가 없었으면 좋겠다.

int와 long의 차이를 직접 겪어보고 공부하라는 의미였다면 성공이지만
우리가 626331이라는 숫자가 콜라츠 추측일 때는 int의 최대 값을 넘는다는 것을 어떻게 바로 안단 말인가!!!

순간 내가 뭘 잘못했지?!라는 생각이 먼저 들고 감자의 가슴이 철컹했다고!!
너 나빠!!!!😤

profile
나는 말하는 감자다

2개의 댓글

comment-user-thumbnail
2024년 1월 2일

주어진 매개변수의 타입을 바꾸시면 안됩니다.

해당문제는 기본적으로 주어진 변수의 타입과 숫자를 long타입으로 형변환해야한다라는걸 깨닫는데 의의가있습니다.

1개의 답글