Algorithm/backjoon
[백준] 11051번 이항 계수 2 (python,c++)
유쾌한고등어
2023. 2. 23. 15:55
https://www.acmicpc.net/problem/11051
11051번: 이항 계수 2
첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 1,000, 0 ≤ \(K\) ≤ \(N\))
www.acmicpc.net
숫자가 너무 크기때문에 10,007로 나눈 나머지를 구하라는 것이다.
SOLUTION CODE
# PYTHON
순수 풀이(시간 초과)
import sys
MOD = 10007
sys.setrecursionlimit(10**7)
N,K = map(int,input().split())
def bino(n,k):
if k==0 or k== n:
return 1
return bino(n-1,k-1) + bino(n-1,k)
print(bino(N,K))
재귀
import sys
MOD = 10007
sys.setrecursionlimit(10**7)
cache = [[0]* 1001 for _ in range(1001)]
N,K = map(int,input().split())
def bino(n,k):
if cache[n][k]: # 값이 있는경우 바로 값을 가져다쓴다.
return cache[n][k]
if k==0 or k==n:
cache[n][k] = 1
else:
cache[n][k] = bino(n-1,k-1) + bino(n-1,k) # 10007 초과 할 수있음
cache[n][k] %= MOD
return cache[n][k]
print(bino(N,K))
반복문
MOD = 10007
cache = [[0]* 1001 for _ in range(1001)]
N,K = map(int,input().split())
# 이중 for문
for i in range(1001): # 한 행씩 값 차례로 넣어주기
cache[i][0] = cache[i][i] = 1
for j in range(1,i):
cache[i][j] = cache[i-1][j-1] + cache[i-1][j]
cache[i][j] %= MOD
print(cache[N][K])
# C++
재귀
#include <iostream>
#include <cstring>
using namespace std;
int N, K;
const int MAX = 1001;
int cache[MAX][MAX];
const int MOD = 10007;
int bino(int n, int k)
{
if (n == k || k == 0) return 1;
if (cache[n][k] != -1)
return cache[n][k];
return cache[n][k] = ((bino(n - 1, k) + bino(n - 1, k - 1)))%MOD;
}
int main()
{
memset(cache, -1, sizeof(cache)); // 초기화
cin >> N >> K;
cout << bino(N, K) << endl;
return 0;
}
반복문
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,k;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> k;
// n+1개 원소, 각 vector는 k+1개의 원소를 가지고 0으로 초기화
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];
dp[i][j]%=10007;
}
}
}
cout<<dp[n][k]<<'\n';
}