콜라스 추측
[기본 상태]
class Solution {
public int solution(int num) {
int answer = 0;
return answer;
}
}
[풀이에 필요한 조건]
연산하는 결과값이 1일 때, 루프를 탈출하기위해 for문 위에 loop: 를 씌워 조건에 맞는 경우 루프를 탈출하도록 함. (break loop;)
연산이 1회 진행될 때마다 answer 을 +1 해줌.
총 계산 횟수가 500회가 되면 answer에 -1을 넣고 반복을 종료하여 값을 return 함.
연산에 사용되는 변수가 int이면 안 됨.
int 형태에서 표현 가능한 최대 정수는 2,147,483,647 이기 때문.
https://ko.wikipedia.org/wiki/2147483647
[해답]
class Solution {
public int solution(int num) {
int answer = 0;
// 3번 예제의 숫자는 int형으로 계산시에 int형 자료의 최댓값인 2,147,483,647 을 넘게되어 연산이 정상적으로 수행되지 않음
// long형의 변수로 대체하여 계산
long long_num=num;
loop:
for(int i=1 ; i<=500 ; i++){
if(long_num==1){
break loop;
}
else if(long_num%2 == 0){
long_num /= 2;
answer += 1;
}
else{
long_num = long_num*3+1;
answer += 1;
}
if(i==500){
answer = -1;
}
}
return answer;
}
}
class Solution {
public int solution(int num) {
int answer = 0;
// 3번 예제의 숫자는 int형으로 계산시에 int형 자료의 최댓값인 2,147,483,647 을 넘게되어 연산이 정상적으로 수행되지 않음
// long형의 변수로 대체하여 계산
long long_num=num;
loop:
for(int i=1 ; i<=500 ; i++){
if(long_num==1){
break loop;
}
else if(long_num%2 == 0){
long_num /= 2;
answer += 1;
}
else{
long_num = long_num*3+1;
answer += 1;
}
if(i==500){
answer = -1;
}
}
return answer;
}
}
public class Main {
public static void main(String[] args) {
Solution sol = new Solution();
int num1=6;
int num2=16;
int num3=626331;
int result1 = sol.solution(num1);
int result2 = sol.solution(num2);
int result3 = sol.solution(num3);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
}