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 때문에 엄청나게 고민을 하였다.
왜냐하면 지금 매개변수 num이 int형으로 주어지는데
이것을 그냥 그대로 두고 문제를 풀면 반복문으로 풀던, 재귀함수로 풀던 테스트케이스 3번에서 계속 에러가 난다.



기댓값은 -1인데 내 코드는 488번만에 1이라는 값을 얻는 것이다!🤨
System.out.println();을 이용해서 내 코드를 파악했는데
그때도 왜 그런지 제대로 파악하지 못하다가 우연히 int를 long으로 바꿔보고 나서야 문제를 해결할 수 있었다.
그런데 재귀함수는 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(참고 자료)
728x90