백준 1003번 (피보나치 함수, C++, DP) [BAEKJOON]

피보나치 함수

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

시간 제한메모리 제한제출정답맞힌 사람정답 비율
0.25 초 128 MB178348520484083231.975%

문제

다음 소스는 N번째 피보나치 수를 구하는 C++ 함수이다.

int fibonacci(int n) {
    if (n == 0) {
        printf("0");
        return 0;
    } else if (n == 1) {
        printf("1");
        return 1;
    } else {
        return fibonacci(n‐1) + fibonacci(n‐2);
    }
}

fibonacci(3)을 호출하면 다음과 같은 일이 일어난다.

fibonacci(3)은 fibonacci(2)와 fibonacci(1) (첫 번째 호출)을 호출한다.

fibonacci(2)는 fibonacci(1) (두 번째 호출)과 fibonacci(0)을 호출한다.

두 번째 호출한 fibonacci(1)은 1을 출력하고 1을 리턴한다.

fibonacci(0)은 0을 출력하고, 0을 리턴한다.

fibonacci(2)는 fibonacci(1)과 fibonacci(0)의 결과를 얻고, 1을 리턴한다.

첫 번째 호출한 fibonacci(1)은 1을 출력하고, 1을 리턴한다.

fibonacci(3)은 fibonacci(2)와 fibonacci(1)의 결과를 얻고, 2를 리턴한다.

1은 2번 출력되고, 0은 1번 출력된다. N이 주어졌을 때, fibonacci(N)을 호출했을 때,

0과 1이 각각 몇 번 출력되는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. N은 40보다 작거나 같은 자연수 또는 0이다.

출력

각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.

예제 입력 1

3
0
1
3

예제 출력 1

1 0
0 1
1 2

예제 입력 2

2
6
22

예제 출력 2

5 8
10946 17711

출처

알고리즘 분류


테스트 코드

1 – 10 까지 확인

#include <iostream>

using namespace std;

int T, N, Zero, One;

int fibonacci(int n) {

	if (n == 0) {
		Zero++;
		return 0;
	} 
	else if (n == 1) {
		One++;
		return 1;
	}
	else return fibonacci(n - 1) + fibonacci(n - 2);
}

int main()
{
	cin >> T;
	for (int i = 0; i < T; i++) {
		cin >> N;
		Zero = 0;
		One = 0;
		fibonacci(N);
		cout << Zero << " " << One << "\n";
	}

	return 0;
}

arrZero[0] = 1, arrZero[1] = 0, arrZero[2] = 1 / arrZero[N] = arrZero[N-1] + arrZero[N-2]

arrOne[0] = 0, arrOne[1] = 1, arrOne[2] = 1 / arrOne[N] = arrOne[N-1] + arrOne[N-2] 점화식을 발견

N = 0 일때 arrZero[0] 를 생각해야 한다. (생각을 못해 12%에서 틀렸습니다.)

통과된 코드

#include <iostream>
#include <list>

using namespace std;

int T, N, Zero, One;

long long int arrZero[41] = {1, 0, 1}; // 초기화
long long int arrOne[41] = {0, 1, 1}; // 초기화

list<int> myList;

int main()
{
	cin >> T;

	for (int i = 0; i < T; i++) {
		cin >> N;
		myList.push_back(N);
	}

	for (auto it = myList.begin(); it != myList.end(); it++) {
		for (int i = 3; i <= *it; i++) {
			if (arrZero[i] == 0) arrZero[i] = arrZero[i - 1] + arrZero[i - 2];
			if (arrOne[i] == 0) arrOne[i] = arrOne[i - 1] + arrOne[i - 2];
		}

		cout << arrZero[*it] << " " << arrOne[*it] << "\n";
	}

	return 0;
}

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤