Algorithm/Baekjoon
[Algorithm] Baekjoon 1003번 : 피보나치 함수
MaxLevel
2022. 10. 18. 20:17
https://www.acmicpc.net/problem/1003
1003번: 피보나치 함수
각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.
www.acmicpc.net
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
32
33
34
35
36
37
38
39
|
int zeroCount = 0;
int oneCount = 0;
pair<int, int> pArray[41];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n = 0;
int temp = 0;
pArray[0] = {1,0};
pArray[1] = {0,1};
for (int i = 2; i <= 40; i++)
{
pArray[i].first = pArray[i - 1].first + pArray[i - 2].first;
pArray[i].second = pArray[i - 1].second + pArray[i - 2].second;
}
vector<int> iv;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> temp;
iv.push_back(temp);
}
for (int i = 0; i < iv.size(); i++)
{
cout << pArray[iv[i]].first << ' ' << pArray[iv[i]].second;
cout << endl;
}
return 0;
}
|
cs |
입력된 피보나치수에 대해 0과 1이 얼마나 호출되는지 묻는 문제이다..
문제 예시에 피보나치함수가 있긴한데 당연히 그거 그대로 쓰면 시간초과나고, DP 바텀탑으로 미리 값 기록해놓는 방식을 써야한다.
0과 1호출카운트를 pair로 해서 40까지 값 기록한다음 그대로 출력시키니 당연히 통과는 된다.
찾아보니까 규칙이 있기도 하다.
일반 피보나치처럼 값을 구해놓은 다음 ( dp[i] = dp[i-1] + dp[i-2] ), 0의 카운트는 dp[n-1]을 리턴하면되고 1의 카운트는 dp[n]을 리턴하면 된다.