[boj] (s1) 11051 이항 계수2

강신현·2022년 4월 17일
0

✅ DP ✅ Top Down

문제

링크

풀이

1. 문제 접근 및 해결 로직 (풀이법)

이항 계수 성질에 의해 다음 식을 만족한다.

(N,K)=(N1,K1)+(N1,K)(N,K)=(N-1,K-1)+(N-1,K)

  • 재귀를 사용하고 동일한 연산을 반복해서 수행하는 것을 방지하기 위해 메모이제이션을 활용한다. -> DPTop Down 방법 사용

  • N과 K가 같을 경우 이항 계수는 1, K가 0일 경우 이항 계수는 1이다.

2. 코드

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>

using namespace std;

int memo[1001][1001]; // memo[N][K]
int N, K;

int dp(int N, int K)
{
    if (memo[N][K] != 0) // 이미 구한 값이면 저장해놓은 값 꺼내서 리턴 (메모이제이션)
        return memo[N][K];

    if (N == K || K == 0) memo[N][K] = 1;
    else memo[N][K] = (dp(N-1,K-1) + dp(N-1,K)) % 10007;

    return memo[N][K];
}

int main()
{   
    cin >> N >> K;
    
    dp(N, K);
    
    cout << memo[N][K] << "\n";

    return 0;
}

3. 시간 복잡도 분석

경우의 수를 모두 구하므로
O(N)O(N)

4. 문제에서 중요한 부분

DP문제는 점화식을 도출하는 것이 중요하다.
Bottm Up(반복문)으로 풀지 Top Down(재귀)으로 풀지는 선택사항

profile
땅콩의 모험 (server)

0개의 댓글

관련 채용 정보