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
을 반환해 주세요.
입력된 수, num
은 1 이상 8,000,000 미만
인 정수입니다.
n | result |
---|---|
6 | 8 |
16 | 4 |
626331 | -1 |
입출력 예 #1
문제의 설명과 같습니다.
입출력 예 #2
16 → 8 → 4 → 2 → 1
이 되어 총 4
번 만에 1
이 됩니다.
입출력 예 #3
626331
은 500
번을 시도해도 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
를 실행하며 프로그램이 끝나도록 한다.
answer
이 1
이 아니면서 짝수일 경우에는 answer
을 2
로 나눈 값을 answer
에 저장하고,
answer
이 1
이 아니면서 홀수일 경우에는 answer
을 3
으로 곱하고 1
을 더한 값을 answer
에 저장한다.
그 후 계산한 횟수를 1
증가시킨다.
만약 새로 계산한 answer
의 값이 1
이 되었다면 계산한 횟수인 cnt
를 return
한다.
만약 500
번을 반복했을 때에도 answer
의 값이 1
이 되지 않으면 -1
을 return
한다.