피보나치 함수 문제로 재귀 호출을 통해 0 또는 1 까지 가게 되면 값을 리턴해주는 형식이다.
그러나 문제에 나와 있는 것처럼 피보나치 함수를 그대로 적용하면 시간 초과가 걸린다.

예전에 이 문제를 어떻게 풀까 고민하다가 DP 방식으로 구현을 하지 못해서 해결하지 못했는데
이번에 다시 풀어보니깐 생각보다 쉽게 풀렸다.

접근 방법은 각각의 숫자 별로 0과 1의 값이 몇 개인지 구하는 방식이다.
점화식은 다음과 같다.

dp[n][0]= n번째 숫자에서 0을 호출한 횟수
dp[n][1]= n번째 숫자에서 1을 호출한 횟수


그렇다면 dp[0][0] 과 dp[1][1] 값은 자연스럽게 1이 될 것이다.


다음으로 

dp[2][0] 은 dp[1][0]+dp[0][0] 이 되고

dp[2][1]은 dp[1][1]+dp[0][1]이 된다.


이를 N 번째 까지 수행하면

N 번째에서 0과 1이 몇 번 호출되는지 알 수 있다.



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;
    cin>>T;
    
    int N;
    for(int testCase=0;testCase<T;testCase++){
        scanf("%d",&N);
        
        int dp[41][2]={0};
        dp[0][0]=dp[1][1]=1;
        
        for(int i=2;i<=N;i++){
            dp[i][0]=dp[i-1][0]+dp[i-2][0];
            dp[i][1]=dp[i-1][1]+dp[i-2][1];
        }
        
        printf("%d %d\n",dp[N][0],dp[N][1]);
    }
    return 0;
}
cs

 

'알고리즘(BOJ) > DP' 카테고리의 다른 글

백준 2225번 - 합분해  (0) 2018.04.01
백준 1890번 - 점프  (0) 2018.03.27
백준 1937번 - 욕심쟁이 판다  (0) 2018.03.16
백준 1520번 - 내리막길  (2) 2018.03.03
백준 1965번 - 상자넣기  (0) 2018.02.10

+ Recent posts