Algorithm/BOJ
[백준 알고리즘/BOJ/C++] 1003 피보나치 함수
pinevienna
2021. 1. 31. 18:39
피보나치 함수를 호출했을 때 0과 1을 각각 몇 번 호출하는지 출력하는 문제다
처음엔 시간제한이 있는 줄 모르고 신나게 위 함수에서 printf를 지우고
0과 1을 return 할 때마다 만들어둔 변수에 +1 해준 뒤 최종 return시 그 변수의 값을 출력하는 형태로 짰다
결과는 나오지만 당연히 시간초과...
규칙부터 찾아야 할 것 같다
0부터 차례대로 입력해 보면 결과가 피보나치 수열 그 자체임을 알 수 있다 (?)
0이 호출된 횟수는 N-1번째 피보나치 수, 1이 호출된 횟수는 N번째 피보나치 수다 (N!=0)
이제 코딩은 더 쉽다
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
|
#include <iostream>
using namespace std;
int main() {
int t, n;
long long f[41];
cin >> t;
while (t--) {
cin >> n;
if(n==0)
cout << 1 << ' ' << 0 << "\n";
else {
f[0] = 0;
f[1] = 1;
for (int i = 2; i <= n; i++) {
f[i] = f[i - 1] + f[i - 2];
}
cout << f[n - 1] << ' ' << f[n] << "\n";
}
}
}
|
cs |
이제 시간 초과는 되지 않지만 N이 입력될 때마다 피보나치 수를 구하게 되므로 좀 아쉽다
미리 구해놓고 불러다 쓰면 더 빠를 것 같아서 또 수정
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
|
#include <iostream>
using namespace std;
int main() {
int t, n;
long long f[41];
cin >> t;
//피보나치 수열 구해놓기
f[0] = 0;
f[1] = 1;
for (int i = 2; i <= 40; i++)
f[i] = f[i - 1] + f[i - 2];
while (t--) {
cin >> n;
if(n==0)
cout << 1 << ' ' << 0 << "\n";
else
cout << f[n - 1] << ' ' << f[n] << "\n";
}
}
|
cs |
깔끔