문제
분석
주의할 것이 시간제한이 0.25초이다.
즉, 문제에서 주어진 함수를 이용하게 되면 시간 초과가 뜨게 된다.
이 문제를 풀기 위해서는 메모이제이션을 이용해서 풀어야 한다.
"피보나치 수 2"에서 구현한 소스를 재사용해서 구현해봤다.
구현
#define MAX 50
using namespace std;
class cnt
{
public:
int cnt_0;
int cnt_1;
cnt operator+(const cnt& other)
{
cnt ret;
ret.cnt_0 = this->cnt_0 + other.cnt_0;
ret.cnt_1 = this->cnt_1 + other.cnt_1;
return ret;
}
};
cnt cnt_cache[MAX];
cnt fibo(int n)
{
cnt& ret = cnt_cache[n];
//base case
if (n == 1)
{
ret.cnt_1 = 1;
return ret;
}
if (n == 0)
{
ret.cnt_0 = 1;
return ret;
}
//계산한적이 있는 경우
if (ret.cnt_0 + ret.cnt_1 != 0)
{
return ret;
}
return ret = fibo(n - 1) + fibo(n - 2);
}
int main()
{
int T;
cin >> T;
while (T--)
{
memset(cnt_cache, 0, sizeof(cnt_cache));
int n;
cin >> n;
cnt ans = fibo(n);
cout << ans.cnt_0 << ' ' << ans.cnt_1 << '\n';
}
return 0;
}
회고
카운트하는 부분을 struct이나 pair로도 구현할 수 있다.
이 방법을 이용하면 시간 복잡도가 O(n) 이 나온다.
'알고리즘 > 백준' 카테고리의 다른 글
백준[2748 번] - 피보나치 수 2 (0) | 2020.11.27 |
---|---|
백준[2630번] - 색종이 만들기 (0) | 2020.11.22 |