[백준/C++] 1003번 피보나치 함수
2021. 2. 13. 00:34ㆍ알고리즘/DP
728x90
반응형
문제: www.acmicpc.net/problem/1003
1003번: 피보나치 함수
각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.
www.acmicpc.net
문제풀이
fibonacci(N) 일 때의 0과 1을 각각 몇 번씩 호출하는지를 물어보는 문제이다.
fibonacci(N)은 fibonacci(N-2) + fibonacci(N-1) 을 호출하기 때문에 우리가 피보나치 수열을 구할 때 앞의 두 수의 합을 구하듯이 0과 1의 호출 또한 앞선 두 수의 합을 구하면 된다.
이때 N은 40과 작거나 같은 자연수이므로 벡터를 41의 크기로 선언하여 0과 1의 호출 수를 저장하였다.
0 호출 | 1 호출 | ||
fibonacci(0) | 0 | 1 | 0 |
fibonacci(1) | 1 | 0 | 1 |
fibonacci(2) | fibonacci(0) + fibonacci(1) | 1 | 1 |
fibonacci(3) | fibonacci(1) + fibonacci(2) | 1 | 2 |
fibonacci(4) | fibonacci(2) + fibonacci(3) | 2 | 3 |
코드
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
vector<pair<int, int>> v(41); //41 크기 벡터 선언
v[0].first = 1; //pair의 first는 0호출수
v[0].second = 0; ///pair의 second는 1호출수
v[1].first = 0;
v[1].second = 1;
for(int i=2; i<=40; i++){ //v[0]~v[40]까지 호출수 저장
v[i].first = v[i-2].first + v[i-1].first;
v[i].second = v[i-2].second + v[i-1].second;
}
int T;
cin>>T;
for(int i=0; i<T; i++){
int num;
cin>>num;
cout<<v[num].first<<" "<<v[num].second<<"\n"; //해당 수의 호출수 출력
}
return 0;
}
결과
728x90
반응형
'알고리즘 > DP' 카테고리의 다른 글
[백준/C++] 11727번 2×n 타일링 2 (0) | 2021.02.17 |
---|---|
[백준/C++] 11726번 2×n 타일링 (0) | 2021.02.17 |
[백준/C++] 9461번 파도반 수열 (0) | 2021.02.17 |
[백준/C++] 1676번 팩토리얼 0의 개수 (0) | 2021.02.13 |