문제
https://school.programmers.co.kr/learn/courses/30/lessons/12943
문제 설명
1937년 Collatz가 만든 이 추측은 주어진 숫자가 1이 될 때까지 다음 연산을 반복하면 모든 숫자가 1이 될 수 있다는 추측입니다. 작업은 다음과 같습니다.
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어 주어진 숫자가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1, 즉 1/8이 됩니다. 위의 작업을 몇 번 반복해야 하는지를 반환하는 함수인 솔루션을 완성하십시오. 단, 주어진 숫자가 1이면 0, 1이 아니면 -1을 500번 반복할 때까지 반환한다.
제한
- 번호를 입력하고, num은 1보다 크고 8,000,000보다 작은 정수입니다.
I/O 예제 결과
| 6 | 8일 |
| 16 | 4 |
| 626331 | -하나 |
I/O 예시 설명
I/O 예제 #1
문제의 설명과 같습니다.
I/O 예제 #2
16 → 8 → 4 → 2 → 1이 총 4회 1이 됩니다.
I/O 예제 #3
626331은 500회 시도가 1이 되지 않기 때문에 -1을 반환해야 합니다.
접근하다
주어진 조건에 따라 계산을 반복하고 각 반복마다 응답에 반복 횟수를 기록합니다.
그러나 Collatz 추측은 모든 수에 대해 증명되지 않으므로 500번 시도하여도 1에 도달하지 않으면 -1을 반환하는 조건이 있습니다.
또한 주어진 숫자가 1이면 0을 반환하는 조건도 처리합니다.
한 가지 문제는 매개변수의 기본 유형이 int라는 것입니다.
계산 중 정수 범위(-2147483648~2147483647)을 초과하므로 long으로 변경합니다.
암호
class Solution {
public int solution(long num) {
int answer = 0;
while(num!=1){
num = (num%2 ==0) ? num/2 : num*3+1;
answer++;
if(answer>=500) {
answer=-1;
break;
}
}
return answer;
}
}
