[Java] 콜라츠 추측 (programmers)

Haeun Noh·2022년 12월 21일
0

programmers

목록 보기
25/64
post-thumbnail

1222


문제 설명

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을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.


제한 사항

입력된 수, num1 이상 8,000,000 미만인 정수입니다.


입출력 예

nresult
68
164
626331-1

입출력 예 설명

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

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

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


소스 코드

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

소스 풀이

    public int solution(int num) {
        long answer = num
        int cnt = 0;

num을 초기값으로 가지는 answer변수의 타입을 long으로 설정한다. long으로 설정하는 이유는 곱하고 나누는 과정에서 answer의 답이 음수가 되어 626331을 넣었을 때 488번만에 성공이 되므로 좀 더 넉넉한 long타입으로 설정해주는 것이다.

횟수를 계산하는 cnt는 값의 범위가 적으므로 int로 설정한다.


        while ( answer != 1 ) {
            answer = (answer%2==0 ? answer/2 : answer*3+1);
            cnt++;
            if ( answer == 1 ) return cnt;
            if ( cnt == 500 ) return -1;
        }
        return 0;

num의 값이 1이 아닌 동안 while문을 반복해서 돌린다. 만약 num의 값이 1이라면 바로 while문을 건너뛰고 return 0를 실행하며 프로그램이 끝나도록 한다.

answer1이 아니면서 짝수일 경우에는 answer2로 나눈 값을 answer에 저장하고,
answer1이 아니면서 홀수일 경우에는 answer3으로 곱하고 1을 더한 값을 answer에 저장한다.

그 후 계산한 횟수를 1 증가시킨다.

만약 새로 계산한 answer의 값이 1이 되었다면 계산한 횟수인 cntreturn한다.

만약 500번을 반복했을 때에도 answer의 값이 1이 되지 않으면 -1return한다.


실행 결과



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글