Language/JAVA

[프로그래머스] 콜라츠 추측

paran21 2022. 1. 19. 09:50

https://programmers.co.kr/learn/courses/30/lessons/12947

class Solution {
    public int solution(int num) {
        int answer = 0;
        //연산과정에서 int단위를 넘어가기 때문에 long으로 변환 필요
        long n = (long)num;
        //500회에 대한 조건을 만족시키기 위해 501번 실행
        for (int i = 0; i < 501; i++) {
            if (n > 1 && n % 2 == 0) {
                n /= 2;
                answer++;
            } else if (n > 1) {
                n = n * 3 + 1;
                answer++;
            } else if (n == 1) { //위의 두 조건에서 모두 n>1이 있어 없어도 되는 부분
                break; 
            }
        }
        //answer가 500번 이상이면 조건에 따라 -1 할당
        if (answer > 500) answer = -1;
        return answer;
    }
}

문제 풀면서 고민이 됬던 부분은 여러 조건들을 어떻게 조합하느냐, 였다.

500번을 반복해도 1이 되지 않는다는 부분이 있었는데, 이를 해결하기 위해 의도적으로 for문을 501번 돌려서 answer가 500이상(혹은 ==501이어도 됨)이면 -1이 되도록 하였다.

 

또 n이 1이 되면 for문을 더 진행하지 않도록 해야 했는데, if문을 구성할 때 이미 n>1이라는 조건이 있어서

굳이 별도로 n ==1일 경우 break를 하지 않아도 되었다.

for문 안에서 if문을에 해당되는 경우가 없다면 그냥 for문을 끝내는지, 아니면 횟수만큼 계속 도는 것인지 잘 모르겠다.

지금은 큰 문제가 안되지만 코드가 복잡해지면 효율성에서 문제가 될 수도 있을 것 같다.