연습문제
🔥 콜라츠 추측 🔥
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
위 작업을 몇번이나 반복해야하는지 반환하는 함수, solution을 완성해보자.
단, 작업을 500번 반복해도 1이 되지 않는다면 -1을 반환하자.
입력된 수, num은 1이상 8000000 미만인 정수
1) 6
2) 16
3) 626331
1) 8
6 > 3 > 10 > 5 > 16 > 8 > 4 > 2 > 1
2) 4
3) -1
class Solution {
public int solution(long num) {
int answer = 0;
while(num != 1){
if(num % 2 != 0){
num = (num * 3) + 1;
}else{
num /= 2;
}
answer += 1;
}
if(answer > 500){
answer = -1;
}
return answer;
}
}
단순하게 문제를 따라가면서 코드를 작성했다.
입력받은 숫자 num이 1이 아닐때, 즉 1이 되기 전까지 반복문을 돌면서
2로 나눴을 때의 나머지를 가지고 짝.홀을 판별했다.
그리고 반복문이 돌때마다 answer의 값을 +1 해주어서 총 몇번 반복되었는지 알아보았다.
마지막에는 if문으로 answer의 값이 500보다 커지면 -1을 대입해주고 return해주었다.
❗️ num이 int형으로 설정되어 있는데 long으로 변경해주어야 오류가 발생하지 않는다. 처음에 저게 문제인줄도 모르고 코드만 뚫어져라 쳐다봤다...😭
class Solution {
public int solution(int num) {
long n = (long) num;
for(int i=0;i<500;i++){
if(n==1) return i;
n = (n%2==0)? n/2 : n*3+1;
}
return -1;
}
}
조건문을 여러개 사용하지 않고 코드를 작성할 수 있다니...
i를 500까지 반복하면서 만약 n의 값이 1이 되면 그때의 i를 return해주었다. 위에서 내가 작성한 코드처럼 굳이 +1을 해주지 않아도 되는 것이다.
그리고 삼항연산자를 이용해서 if문으로 길게 작성한 코드를 한줄로 줄여버렸다.
문제를 따라가며 코드를 작성하는 것도 괜찮다고 생각했지만 아직은 실력이 많이 부족한것 같다.
노력하자👍