신규 블로그를 만들었습니다!
문제
다음 소스는 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이 출력되는 횟수를 공백으로 구분해서 출력한다.
예제 입력
3
0
1
3
예제 출력
1 0
0 1
1 2
fibonacci(n) |
피보나치 값 |
0의 개수 |
1의 개수 |
fibonacci(0) |
0 |
1 |
0 |
fibonacci(1) |
1 |
0 |
1 |
fibonacci(2) |
1 |
1 |
1 |
fibonacci(3) |
2 |
1 |
2 |
fibonacci(4) |
3 |
2 |
3 |
fibonacci(5) |
5 |
3 |
5 |
fibonacci(6) |
8 |
5 |
8 |
fibonacci(k) |
fibonacci(k-1) + fibonacci(k-2) |
fibonacci(k-1) |
fibonacci(k) |
코드 구현
// 백준 1003
// 피보나치 함수
#include <stdio.h>
int dp[41];
int fibonacci(int n){
if(n <= 0){
dp[0] = 0;
return 0;
}else if(n ==1){
dp[1] = 1;
return 1;
}
if(dp[n] != 0){
// 계산된 값
return dp[n];
} else {
return dp[n] = fibonacci(n-1) + fibonacci(n-2);
}
}
int main(void){
int test;
scanf("%d", &test);
while(test-- > 0){
int x;
scanf("%d", &x);
if(x == 0){
printf("%d %d\n", 1, 0);
}else if(x == 1){
printf("%d %d\n", 0, 1);
}else{
fibonacci(x);
printf("%d %d\n", dp[x-1], dp[x]);
}
}
return 0;
}
※ 직접 문제 풀고 돌려본 뒤, 채점까지 마친 후에 작성한 글입니다.
더 좋은 방법이 있다면, 댓글로 알려주시면 감사하겠습니다 :)
관련 글
2018/05/02 - [Algorithm] - 알고리즘 :: 다이나믹 프로그래밍(DP) - 피보나치(Fibonacci) C/C++ 구현, 메모이제이션
2018/05/02 - [Algorithm/백준 온라인 저지] - 백준/11726번 :: 2xn 타일링 (C/C++ 구현)
2018/05/02 - [Algorithm/백준 온라인 저지] - 백준/11727번 :: 2xn 타일링 2 (C/C++ 구현)
'Algorithm > 백준 온라인 저지' 카테고리의 다른 글
백준/10817번 :: 세 수 (Java 코드) (6) | 2018.06.16 |
---|---|
백준/2750번 :: 수 정렬하기 (Java 코드, 삽입 정렬, 퀵 정렬, insertion sort, quick sort) (4) | 2018.06.16 |
백준/11727번 :: 2xn 타일링 2 (C/C++ 구현) - DP, 메모이제이션 (4) | 2018.05.02 |
백준/11726번 :: 2xn 타일링 (C/C++ 구현) (5) | 2018.05.02 |
백준/2750번 :: 수 정렬하기 (c/c++) (6) | 2018.04.29 |
최근댓글