-
백준(BOJ) 1003번 피보나치 함수알고리즘 풀이/백준(Boj) 2019. 7. 11. 16:09
문제 : https://www.acmicpc.net/problem/1003
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.
각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. N은 40보다 작거나 같은 자연수 또는 0이다.
출력
각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.
나의풀이:
f(0)의 0과 1의 수 : 1 0
f(1)의 0과 1의 수 : 0 1
f(2)의 0과 1의 수 : 1 1
f(3)의 0과 1의 수 : 1 2
f(4)의 0과 1의 수 : 2 3
f(5)의 0과 1의 수 : 3 5
f(n) 은 f(n-2) + f(n-1) 를 세로로 각각 더해주면 나온다는 것을 알 수 있다.
그림에 보듯 f(n)의 0의수는 f(n-1)의 1의 수와 똑같기에 f(n)들의 1의 수 값을 구해보자
f(n)의 1의 수는 일반 피보나치와 똑같음으로(0 1 1 2 3 5 ... ) n에서의 피보나치를 구한후 n-1 피보나치와 (0의 수) 함께 출력해주면 되겠다
코드 ( C ++ )
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int N;
int cache[41];
int fibonacci(int n) // 피보나치를 구한다.
{
if (n == 0)
return 0;
if (n == 1)
return 1;
int& ret = cache[n];
if (ret != -1)
return ret;
return ret = fibonacci(n - 1) + fibonacci(n - 2);
}
int main()
{
int C;
cin >> C;
while (C--) {
memset(cache, -1, sizeof(cache));
int N;
cin >> N;
if (N == 0) { // f(0)의 0의값과 1의값은 구할수 없으므로 따로 처리해준다.
cout << 1 << " " << 0 << endl;
continue;
}
int ans = fibonacci(N); // fibonacci(N)을 구한다. 즉 1의 수가 된다
int ans2 = fibonacci(N - 1); // fibonacci(N-1)을 구한다 0의 수가 된다.
cout << ans2 << " " << ans << endl;
}
return 0;
}
'알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 2193번 이친수 (0) 2019.07.15 백준(BOJ) 1969번 DNA (0) 2019.07.15 백준(BOJ) 1568번 새 (0) 2019.07.10 백준(BOJ) 2579번 계단 오르기 (0) 2019.07.10 백준(BOJ) 9095번 1,2,3 더하기 (0) 2019.07.09