컴굥일지
[BOJ/백준 11051][C++] 이항계수 2 본문
반응형
문제
https://www.acmicpc.net/problem/11051
문제 내용
정수 n과 k를 입력 받아서 nCk를 구하는 문제이다.
이항계수에 대한 특징을 알면 문제를 쉽게 풀 수 있다.
nCk = (n-1)Ck + (n-1)C(k-1) 라는 것을 이용하면 된다.
문제 풀이
dynamic programming (dp)를 사용하여 문제를 풀면 된다.
이항계수의 특성상 k==0 이거나 n==k 일 때는 값이 1이 된다.
그 이외의 경우는 nCk = (n-1)Ck + (n-1)C(k-1) 를 만족한다.
위 점을 고려하여, 이중 반복문을 사용하여 dp값을 하나하나 채워가면 된다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
//이항계수
////nCk = (n-1)Ck + (n-1)C(k-1)
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
//입력
int n, k;
cin >> n >> k;
vector<vector<int>>dp(n + 1, vector<int>(k + 1, 0));
//문제 해결
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++) {
if (j == 0 || i == j) dp[i][j] = 1;
else dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1])%10007;
}
}
//결과 출력
cout << dp[n][k] << '\n';
}
문제 코드 설명
1) 입력
vector<vector<int>>dp(n + 1, vector<int>(k + 1, 0)); 는 크기가 (n+1)*(k+1)인 이차원 배열 dp를 만들고 0으로 초기화 한다는 의미이다.
2) 문제 해결
문제에서 nCk의 값을 10007로 나눈 나머지를 출력하라고 했으므로, %10007을 식에 적용한다.
반응형
'알고리즘 > 코테 문제' 카테고리의 다른 글
[BOJ/백준 11048][C++] 이동하기 (0) | 2022.02.15 |
---|---|
[BOJ/백준 11399][C++] ATM (0) | 2022.02.14 |
[BOJ/백준 1764][C++] 듣보잡 (0) | 2022.02.10 |
[BOJ/백준 2841][C++] 외계인의 기타 연주 (0) | 2022.02.09 |
[BOJ/백준 14425][C++] 문자열 집합 (0) | 2022.02.08 |
Comments