[Java] 콜라츠 추측 Lv1

Date:     Last Updated:

콜라츠 추측

문제 프로그래머스 FAQ 내용을 보니 카카오나 기업의 문제들은 저작권이 있으니 풀이를
github나 개인블로그에 올리지 말라고 되어 있어서 링크로 대체합니다.

출처: Programmers
콜라츠 추측

문제의 이해

문제 이해 자체는 어렵지 않았다. 입력 된 수를 주어진 조건대로 계산하고 500번 이상 계산해도 원하는 답이 나오지 않으면 -1리턴하고 500번 안에 1이 나오면 몇번 계산했는지 출력. 다만 하나 주의해야 할 점은 int형의 범위를 벗어날 수도 있는 계산이 있을 것 같아서 long형으로 진행했다.

내가 생각한 풀이 방법

  1. 반복문을 500번 돌린다.
  2. 입력된 수가 짝수면 2로 나누고 홀수면 3을 곱하고 더하기 1을 반복한다.
  3. 입력된 수가 1이 되면 반복문 종료.
  4. 이때 반복문이 500번을 넘어가면 -1리턴 후 종료

풀이

첫 번째 풀이

첫번째는 왜 그랬는지 모르겠는데 다시 보니 정말 막 풀었다. 다시 보는데, 이런 문제는 보통 while문이 적당할거라는 생각을 분명히 했는데 주어진 조건에서 500이라는 제한이 있어서 그런가 for문으로 풀었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
    public int solution(int num) {
        int answer = 0;
        long num1 = num;

        for(int i = 0; i < 500; i++){
            if(i == 499){
                answer = -1;
                break;
            }

            if(num1 == 1){
                break;
            }
            else if(num1 % 2 == 0){
                num1 = num1 / 2;
            }
            else{
                num1 = (num1 * 3) + 1;
            }
            answer++;
        }
        return answer;
    }
}

두 번째 풀이

로직은 첫번째 풀이와 동일하지만 코드를 줄이고 반복문을 while문으로 바꾸었다. while로 바꾸기만 했는데도 코드가 훨씬 좋아진 것 같다. 다만 여기서 약간만 더 수정하면 좋을 것 같은데 뭘 바꿔야할지를 모르겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
    public int solution(int num) {
        int answer = 0;
        long num1 = num;
        
        while(num1 != 1){
            num1 = ((num1 & 1) != 1) ? num1 / 2 : (num1 * 3) + 1;
            answer++;
            if(answer == 500){
                answer = -1;
                break;
            }
        }
        return answer;
    }
}


Leave a comment