백준/C++
백준 1003번 : 피보나치 함수 [C++]
대니스
2022. 8. 28. 14:27
주소 : https://www.acmicpc.net/problem/1003
1003번: 피보나치 함수
각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.
www.acmicpc.net
소스 코드 :
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
typedef struct
{
int number;
int one;
int zero;
}Num;
void fibonacci(int n)
{
Num N[41];
if (n == 0)
{
cout << 1 << ' ' << 0<<'\n';
}
if (n == 1)
{
cout << 0 << ' ' << 1<<'\n';
}
if (n > 1)
{
N[0].number = 0;
N[0].one = 0;
N[0].zero=1;
N[1].number = 1;
N[1].zero = 0;
N[1].one=1;
for (int i = 2;i <= n;i++)
{
N[i].number = N[i - 2].number + N[i - 1].number;
N[i].one = N[i - 2].one + N[i - 1].one;
N[i].zero = N[i - 2].zero + N[i - 1].zero;
}
cout << N[n].zero << ' ' << N[n].one << '\n';
}
}
int main()
{
ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
int T, N;
cin >> T;
while (T != 0)
{
cin >> N;
fibonacci(N);
T--;
}
}
마무리 : 피보나치 함수는 문제에 나와 있는 예제로 풀 수 있지만 그러면 시간이 초과하기 때문에 다른 방식으로 구해야한다. 그 방식은 다이나믹 프로그래밍인 것이다.
다이나믹 프로그래밍은 하나의 큰 문제를 여러 개의 작은 문제로 나눠서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 알고리즘이다. 나는 이 방법을 사용하여 풀었긴 했지만 0과 1이 출력되는 횟수를 세어주면 되지만 피보나치 수까지 구한 코드를 짜버렸다.