본문 바로가기
Language/Java

[Programmers | Java | 연습문제 풀이] 콜라츠 추측 - Solution with Loop 또는 Recursion

by ㅇ달빛천사ㅇ 2024. 6. 19.
728x90

KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | Algorithm CODEKATA

🧐 콜라츠 추측

🏷 관련 주제 : 반복문 재귀함수 조건문 연산자



✔ Solution with 반복문

class Solution {
    public int solution(long num) {
        int answer = 0;

        while (num != 1 && answer < 500) {
            if (num % 2 == 0) {
                num /= 2;
            } else {
                num = num * 3 + 1;
            }
            answer++;
        }

        if (answer >= 500) {
            answer = -1;
        }

        return answer;
    }
}
채점 결과


✔ Solution with 재귀함수

class Solution {
    public int solution(long num) {
        int answer = 0;

        if (num % 2 == 0) {
            answer = solution(num / 2);
        } else if (num != 1) {
            answer = solution(num * 3 + 1);
        } else {
            return 0;
        }

        if (answer == 500 || answer == -1) {
            return -1;
        }

        return answer + 1;
    }
}
채점 결과


💥 오늘 만난 문제 & 나의 시도 💦 & 해결 방법 👍

📌 오늘 만난 문제 : 매개변수로 준 정수 num이 아래의 작업을 몇번 반복하여야 하는지 그 횟수를 반환하는 함수를 완성하시오.

1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.


단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.


오늘 푼 문제는 변수 type 때문에 엄청나게 고민을 하였다.
왜냐하면 지금 매개변수 numint형으로 주어지는데
이것을 그냥 그대로 두고 문제를 풀면 반복문으로 풀던, 재귀함수로 풀던 테스트케이스 3번에서 계속 에러가 난다.

기댓값은 -1인데 내 코드는 488번만에 1이라는 값을 얻는 것이다!🤨

 

System.out.println();을 이용해서 내 코드를 파악했는데
그때도 왜 그런지 제대로 파악하지 못하다가 우연히 intlong으로 바꿔보고 나서야 문제를 해결할 수 있었다.


그런데 재귀함수는 num이 1이 될 때까지 재귀함수를 부르고 그 후에 반환값을 받아오기 때문에
반복문으로 푸는 것이 더 낫지 않을까? 하는 생각이 든다.

 

💬 무엇을 새롭게 알았는지

데이터 타입별 범위

  • 정수형
    • byte : -128 ~ 127
    • short : -32768 ~ 32767
    • int : -2147483648 ~ 2147483647
    • long : -9223372036854775808 ~ 9223372036854775807
  • 실수형
    • float : 1.4E-45 ~ 3.4028235E38
    • double : 4.9E-324 ~ 1.7976931048623157E308

📚 References(참고 자료)

[JAVA] 3. 기본형 데이터타입의 저장 가능 범위

728x90


Top