[Java] 콜라츠 추측 Lv1
콜라츠 추측
문제 프로그래머스 FAQ 내용을 보니 카카오나 기업의 문제들은 저작권이 있으니 풀이를
github나 개인블로그에 올리지 말라고 되어 있어서 링크로 대체합니다.
출처: Programmers
콜라츠 추측
문제의 이해
문제 이해 자체는 어렵지 않았다. 입력 된 수를 주어진 조건대로 계산하고 500번 이상 계산해도 원하는 답이 나오지 않으면 -1리턴하고 500번 안에 1이 나오면 몇번 계산했는지 출력. 다만 하나 주의해야 할 점은 int형의 범위를 벗어날 수도 있는 계산이 있을 것 같아서 long형으로 진행했다.
내가 생각한 풀이 방법
- 반복문을 500번 돌린다.
- 입력된 수가 짝수면 2로 나누고 홀수면 3을 곱하고 더하기 1을 반복한다.
- 입력된 수가 1이 되면 반복문 종료.
- 이때 반복문이 500번을 넘어가면 -1리턴 후 종료
풀이
첫 번째 풀이
첫번째는 왜 그랬는지 모르겠는데 다시 보니 정말 막 풀었다. 다시 보는데, 이런 문제는 보통 while문이 적당할거라는 생각을 분명히 했는데 주어진 조건에서 500이라는 제한이 있어서 그런가 for문으로 풀었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public int solution(int num) {
int answer = 0;
long num1 = num;
for(int i = 0; i < 500; i++){
if(i == 499){
answer = -1;
break;
}
if(num1 == 1){
break;
}
else if(num1 % 2 == 0){
num1 = num1 / 2;
}
else{
num1 = (num1 * 3) + 1;
}
answer++;
}
return answer;
}
}
두 번째 풀이
로직은 첫번째 풀이와 동일하지만 코드를 줄이고 반복문을 while문으로 바꾸었다. while로 바꾸기만 했는데도 코드가 훨씬 좋아진 것 같다. 다만 여기서 약간만 더 수정하면 좋을 것 같은데 뭘 바꿔야할지를 모르겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int solution(int num) {
int answer = 0;
long num1 = num;
while(num1 != 1){
num1 = ((num1 & 1) != 1) ? num1 / 2 : (num1 * 3) + 1;
answer++;
if(answer == 500){
answer = -1;
break;
}
}
return answer;
}
}
Leave a comment