728x90
▶문제 : 우박수 길이 (3n+1) (large) (codeup.kr)
▶코드 작성
#include <stdio.h>
int memo[100000001];
int func(long long n) {
if (n == 1) return 1;
if (n > 100000000) {//1억을 초과하였을 때
if (n % 2 == 0) return func(n / 2) + 1;//memo배열 없이 계산
else return func(n * 3 + 1) + 1;
}
if (memo[n] != 0) return memo[n];//memo배열에 저장되어있다면 반환
if (n % 2 == 0) return memo[n] = func(n / 2) + 1;//memo배열에 길이 저장
else return memo[n] = func(n * 3 + 1) + 1;//memo배열에 길이 저장
}
int main() {
int a, b, num = 0;
scanf("%d %d", &a, &b);
for (int i = a; i <= b; i++) {
int n = func(i);
if (n > memo[num]) num = i;//큰 값 찾기
}
printf("%d %d", num, memo[num]);
}
▶해석
재귀와 메모이제이션을 이용해 문제를 풀 수 있었다.
하지만 이 문제는 n이 홀수일 때 n*3+1해 주는 것에서 생각을 해야 한다.
n이 1억을 넘으면 memo배열을 이용할 수 없으므로 n값을 long long으로 선언하여 memo배열 없이 길이를 구하였다.
728x90
'코드업(codeup) > C' 카테고리의 다른 글
코드업(codeup) 1936 : (재귀함수) 두 노드간의 거리 C언어 (0) | 2022.09.17 |
---|---|
코드업(codeup) 2605 : 캔디팡 C언어 (0) | 2022.07.30 |
코드업(codeup) 3703 : 사탕 줍기 1 C언어 (0) | 2022.07.17 |
코드업(codeup) 3802 : 쉬운 계단 수 C언어 (0) | 2022.03.10 |
코드업(codeup) 3801 : 오르막 수 C언어 (0) | 2022.03.10 |
댓글