일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 우분투 키보드 딜레이
- 백준 1003번
- endl
- 백준 2108번
- 백준 1002번
- ubuntu keyboard delay
- 백준 1015번
- 백준 1063번
- 백준 10773번
- \n
- 백준 7568번
- 우분투 입력시간
- 백준 1037번
- endl과\n차이
- 백준 1049번
- 백준 1157번
- 백준 1026번
- 백준 1004번
- LG Aimers
- 피보나치
Archives
- Today
- Total
예비 개발자의 노트
백준 1003번) 피보나치 함수 본문
본문의 코드보다 더 효율적인 코드가 분명 존재합니다.
참고만 해주시면 감사하겠습니다.
코드 지적은 언제나 환영입니다.
풀이
우선, 피보나치 수는
f(2) = f(1) + f(0) = 1
f(3) = f(2) + f(1) = f(1) + f(0) + f(1) = 2
f(4) = f(3) + f(2) = f(2) + f(1) + f(1) + f(0) = f(1) + f(0) + f(1) + f(1) + f(0) = 3
f(5) = f(4) + f(3) = f(3) + f(2) + f(2) + f(1) = f(2) + f(1) + f(1) + f(0)+ f(1) + f(0) + f(1) = f(1) + f(0) + f(1) + f(1) + f(1) + f(0) + f(1) + f(0) = 5
...
과 같이 계산할 수 있다.
문제에서 주어진 피보나치 함수를 이용했을 시간초과가 발생한다.
시간초과를 방지하기 위해 재귀함수가 아닌 while문을 이용하여 피보나치 수를 계산하였다.
0일 때는 피보나치 수가 0이기 때문에 "1 0"을 출력하고
1일 때는 피보나치 수가 1이기 때문에 "0 1"을 출력했다.
2이상일 때는 while문을 이용하여 피보나치 수를 계산한다.
3
1 2
결과: 2
4
2 3
결과: 3
5
3 5
결과: 5
6
5 8
결과: 8
본문의 코드에
cout << "결과: " << c << '\n';
를 추가하여 결과 값을 확인해 보았을 때 일정한 규칙을 찾을 수 있다.
ex) fibonacci(6)에서 0의 갯수는 fibonacci(5)의 결과 값 이고 1의 갯수는 fibonacci(6)의 결과 값이다.
코드
#include "iostream"
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int tc;
cin >> tc;
for(int i = 0 ; i < tc ; i++){
int n;
cin >> n;
int a = 0, b = 0, c = 0;
if(n==0){
cout << "1 0\n";
continue;
}
else if(n==1){
cout << "0 1\n";
continue;
}
else if(n>1){
a = 0;
b = 1;
int count = 2;
while (count <= n)
{
c = a + b;
a = b;
b = c;
count += 1;
}
}
cout << a << " " << b << '\n';
}
return 0;
}
'Baekjoon Online Judge' 카테고리의 다른 글
백준 1037번) 약수 (0) | 2023.01.13 |
---|---|
백준 1015번) 수열 정렬 (0) | 2023.01.09 |
백준 1002번) 터렛 (1) | 2023.01.09 |
백준 1004번) 어린 왕자 (0) | 2023.01.09 |
백준 7568번) 덩치 (1) | 2023.01.09 |