본문 바로가기
백준

[11051] 이항 계수 2

by kmyobin 2022. 8. 27.


원래는 팩토리얼로 문제를 풀었으나, N의 범위가 커지면서 쓸 수 없게 되었다

그래서 알고리즘 설계 때 배운 DP(동적 프로그래밍)을 떠올리며 문제를 풀었다 ( 시험에서는 틀렸다 ㅡㅡ )

 

DP(Dynamic Programming) : 하나의 큰 문제를 여러 개의 작은 문제로 쪼갠 다음, 과거에 구한 해를 활용하는 알고리즘

 

이항계수는 nCk로 나타낼 수 있는데, 2차원 배열로 만들었다

이항 계수 하면 떠오르는 그림을 그려보고, 행과 열을 따져보아서 값이 어떻게 들어가는지 생각해보았다

nCk = n-1Ck-1 + n-1Ck를 이용하여 dp 점화식을 세웠다

 

dp[i][j] = dp[i-1][j-1] + dp[i-1][j]

 

만든 점화식을 for문을 이용하여 구현하였다

dp[i][0]과 dp[i][i]은 항상 1이기 때문에 초기화를 해주었다

 

수가 너무 크기 때문에 10007로 나눈 나머지를 구해야 한다

그래서 저 점화식에 '%10007'을 써주었다

 

 

그렇게 완성된 코드는 다음과 같다

#include <iostream>
using namespace std;

int N, K;
int dp[1001][1001];

int f(int n, int k) {

	for (int i = 0; i <= n; i++) {
		dp[i][0] = 1;
	}

	for (int i = 0; i <= k; i++) {
		dp[i][i] = 1;
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= k; j++) {
			dp[i][j] =( dp[i - 1][j - 1] + dp[i - 1][j]) % 10007;
		}
	}

	return dp[n][k];
}


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> K;

	printf("%d", f(N,K));


}

'백준' 카테고리의 다른 글

[9375] 패션왕 신해빈  (0) 2022.08.29
[1010] 다리 놓기  (0) 2022.08.28
[11050] 이항 계수 1  (0) 2022.08.25
[3036] 링  (0) 2022.08.25
[2981] 검문  (0) 2022.08.19

댓글