Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

luke

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

알고리즘문제/프로그래머스(Java)

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

luke-king 2024. 1. 25. 20:45

 

 

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/12943

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

 

 

 

문제.


 

 

 

 

 

 

 

 

 

풀이.


class Solution {
    public int solution(int num) {
        int answer = 0;
        long n = (long) num;
        int cnt = 0;
        
         while (n > 0) {
			//처음 주어진 수가 1 일경우 0 반환
            if (n == 1) {
                answer = 0;
                break;
            }
            //반복 회수가 500 이상일때 -1 반환
            if (cnt >= 500) {
                answer = -1;
                break;
            }
			// 주어진 수가 1이 될때까지 루프가 돌며 반복회수(cnt) 증가
            if (n % 2 == 0) {
                n = n / 2;
                cnt++;
            } else {
                n = n * 3 + 1;
                cnt++;
            }
			// 주어진 수가 1이 되는 순간 반복회수가 몇인지 반환
            if (n == 1) {
                answer = cnt;
                break;
            }


        }
        return answer;
    }
}

문제는 그렇게 어렵지 않았다고 생각한다.

다만..!! 위 문제를 읽어보면 주어진 수 가 1인 경우에는 바로 0을 반환한다고 나와있어 1일경우 루프가 돌자마자  if문을 통해 0을 반환하게 했다. 첫번째 if문이 없다면 1입력을 했을때 cnt는 3을 반환한다.

이게...프로그래머스 오류인지 잘은 모르겠지만... 암튼!! 첫번째 if문이 없어도 정답이 되기에 많이 당황스러웠다.

 

참!! int형인 num을 long 으로 바꿔준 이유는 500번이상 돌아갔을때의 조건식을 충족하기위해 더큰 타입으로 바꿔준 것이다. 그렇지 않으면 오버플로우가 발생한다..