콜라츠 추측_Java

컴투루·2022년 5월 10일
0

프로그래머스 Lv.1

목록 보기
7/38

연습문제

🔥 콜라츠 추측 🔥


👀 문제

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문으로 길게 작성한 코드를 한줄로 줄여버렸다.


👏 마무리

문제를 따라가며 코드를 작성하는 것도 괜찮다고 생각했지만 아직은 실력이 많이 부족한것 같다.

노력하자👍

Github

profile
맘 먹으면 못할 게 없지

0개의 댓글