본문 바로가기
백준BOJ/동적 계획법

백준 24416 알고리즘 수업 - 피보나치 수 1

by 이일아 2022. 6. 8.
반응형

https://www.acmicpc.net/problem/24416

 

24416번: 알고리즘 수업 - 피보나치 수 1

오늘도 서준이는 동적 프로그래밍 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자. 오늘은 n의 피보나치 수를 재귀호출과 동적 프로그래밍

www.acmicpc.net

 

 

 

EXPLANATION

코드의 실행 횟수에서 코드는 fn = fn-1 + fn - 2를 말한다.

 

두 번째 코드는 N이 1, 2라면 f[i] = f[i - 1] + f[i + 1]가 실행되지 않을거고 

그 이외의 수라면 반복문 횟수(N - 2)만큼 실행될 것이다.

N은 5이상이므로 언제나 N - 2를 출력하도록 해도 된다. 

ex) 

N = 5일 때

f[3] = f[2] + f[1]

f[4] = f[3] + f[2]

f[5] = f[4] + f[3]

3회 실행

 

 

첫번째 코드는 

fib(n) {
    if (n = 1 or n = 2)
    then return 1;
    else return (fib(n - 1) + fib(n - 2));	//return int fib = fib(n - 1) + fib(n - 2)랑 같다.
}

예를 들면서 설명하겠다.

갈라지는 곳에서  fib = fib(n - 1) + fib(n - 2) 코드 실행됨

리프 노드들을 모두 다 더하면  fn  이다.

그림에서 볼 수 있듯이 코드 실행 횟수는 리프 노드 1이 +되는 횟수와 같다.

따라서 실행횟수는 fn - 1이 되야 하는데

어째서인지 첫번째 예제를 보면 N = 5일 때 실행횟수는 fn인 5를 하고 있다.

두번째 예제도 N=30일 때 실행횟수는 fn인 832040.

그래서 그냥 fn이 첫번째 실행횟수의 코드가 되도록 작성했더니 맞았습니다. 라는 메세지를 얻었다.

이거 왜 그런 지 아시는 분 댓글로 알려주시면 정말 감사하겠습니다.

 

 

 

CODE

#include <iostream>
using namespace std;
typedef long long ll;

ll fib[41];    //for i[1, 40]

int main() {

	fib[1] = fib[2] = 1;
	for (int i = 3; i <=40; i++) fib[i] = fib[i - 1] + fib[i - 2];	//첫 번째 코드 실행 횟수 구하기(fib[N]

	int N; cin >> N;
	cout << fib[N] << ' ' << N - 2;	//두번째 코드 실행 횟수는 N - 2
}

 

반응형

'백준BOJ > 동적 계획법' 카테고리의 다른 글

백준 1932 정수 삼각형  (0) 2022.06.10
백준 1149 RGB거리  (0) 2022.06.09
백준 9461 파도반 수열, 연속합 1912  (0) 2022.06.09
백준 1904 01타일  (0) 2022.06.08
백준 9184 신나는 함수 실행  (0) 2022.06.08

댓글