1. 문제
콜라츠 추측은 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측이다.
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
예를 들어, 입력된 수가 6이라면 6→3→10→5→16→8→4→2→1 이 되어 총 8번 만에 1이 된다. 위 작업을 몇 번이나 반복해야하는지 반환하는 함수를 만드시오. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환하시오.
2. 제한
입력된 수, num은 1 이상 8000000 미만인 정수입니다.
3. 정답
class Solution {
public int solution(int num) {
int count = 0;
long temp = (long)num;
while ((temp != 1) && (count != 500)) {
if(temp % 2 == 0) {
temp /= 2;
}
else {
temp = temp * 3 + 1;
}
count++;
}
if (temp != 1) {
return -1;
}
else {
return count;
}
}
}
4. 설명
4-1. 작업들중에서 짝수인 경우 3을 곱하는 과정이 있는데 그 과정에서 오버플로우가 발생할 수 있기 때문에 num을 long형변환해준 temp변수를 만들어준다.
4-2. 짝수이면 2로 나누고 홀수이면 3을 곱한뒤 1을 더해주는 반복 작업을 temp가 1이 아니고 count(횟수)가 500번이 되기 전까지 반복합니다.
4-3. 반복문을 다 돌고 나왔는데 temp가 1이 아니라면 500번만에 1이 되지 못한 경우이므로 -1을 return한다.
4-4. 위와 같은 경우가 아니라면 temp가 1이 된 것이므로 작업 횟수 count를 return한다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
하샤드 수(JAVA) (0) | 2022.01.19 |
---|---|
제일 작은 수 제거하기(JAVA) (0) | 2022.01.19 |
정수 제곱근 판별(JAVA) (0) | 2022.01.19 |
정수 내림차순으로 배치하기(JAVA) (0) | 2022.01.19 |
자연수 뒤집어 배열로 만들기(JAVA) (0) | 2022.01.18 |