개발자/문제풀이 (C언어)
[백준/BOJ] 24416번 알고리즘 수업 - 피보나치 수 1 (C/C++)
devBB
2024. 2. 24. 10:18
728x90
반응형
백준 온라인 저지(BOJ) 24416번 알고리즘 수업 - 피보나치 수 1
https://www.acmicpc.net/problem/24416
24416번: 알고리즘 수업 - 피보나치 수 1
오늘도 서준이는 동적 프로그래밍 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자. 오늘은 n의 피보나치 수를 재귀호출과 동적 프로그래밍
www.acmicpc.net
* 사용언어 : C언어, C++
1. 문제
n의 피보나치 수를 2가지 방식으로 구할 때 두 코드의 실행 횟수를 출력
(① 재귀, ② 동적 계획법)
2. 풀이
동일한 연산의 반복으로 결과값을 구하는 경우 top-down 방식, bottom-up 방식으로 구분이 되는데
두 가지 방식을 구현해보고 비교해볼 수 있는 문제입니다.
문제 풀이 자체는 단순하니 주어진 의사 코드를 본인이 사용하는 언어에 맞추어 구현만 하면 됩니다.
한 가지 주의할 점은 의사 코드 상에 # 코드 1, # 코드 2라고 표시된 부분에서
count를 증가시켜주어야 정확한 정답이 됩니다.
저는 문제를 대충 읽고 # 코드 1을 제 마음대로 fib호출 처음에 넣었다가 답이 틀려서 한참 헤맸었습니다.
SW 개발은 고객(문제)의 요구사항을 정확히 파악하는 것이 가장 중요한 것 같습니다.
추가로 # 코드 2는 for문 내에서 굳이 1씩 증가시킬 필요가 없어보여서
for문 종료 후 반복 횟수를 한 번에 계산하였습니다.
3. 코드
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
24416_알고리즘 수업 - 피보나치 수 1
1116KB 224ms
*/
#include <cstdio>
const int LM = 41;
int f[LM], N, c1, c2;
int fib(int n) {
if (n == 1 || n == 2) {
++c1;
return 1; // code 1
}
return fib(n - 1) + fib(n - 2);
}
int fibonacci(int n) {
f[1] = f[2] = 1;
for (int i = 3; i <= n; ++i) {
f[i] = f[i - 1] + f[i - 2]; // code 2
}
c2 = n - 2;
return f[n];
}
int main() {
#ifdef _WIN32
freopen("input.txt", "r", stdin);
#endif // _WIN32
scanf("%d", &N);
fib(N);
fibonacci(N);
printf("%d %d\n", c1, c2);
return 0;
}
728x90
반응형