
알고리즘 문제 풀이
문제
https://www.acmicpc.net/problem/2407
2407번: 조합
n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)
www.acmicpc.net
풀이
조합에서 사용되는 파스칼의 삼각형을 이용한 DP 방식으로 접근한다.
점화식은 DP[i][j] = DP[i-1][j] + DP[i-1][j-1];
생각해야할 부분으로, 100 C 5 조합같은 경우는 long long int 자료형을 초과하는 범위이므로, 문자열을 사용하여 해결해야한다. 문자열 덧셈 함수와 파스칼 삼각형을 이용한 조합 함수 1개를 만들어서 풀이하였다.
소스 코드
// 헤더파일
#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <cctype>
#include <set>
#include <string.h>
using namespace std;
int N, M;
string arr[101][101];
string b_add(string s1, string s2) {
int sum = 0;
string r;
while (!s1.empty() || !s2.empty() || sum) {
if(!s1.empty()) {
sum += s1.back() - '0';
s1.pop_back();
}
if (!s2.empty()) {
sum += s2.back() - '0';
s2.pop_back();
}
r.push_back((sum % 10) + '0');
sum /= 10;
}
reverse(r.begin(), r.end());
//cout << r << '\n';
return r;
}
void comb() {
for (int i = 2; i <= N; i++) {
for (int j = 0; j <= M; j++) {
if (i == j || j == 0)
arr[i][j] = "1";
else
arr[i][j] = b_add(arr[i - 1][j - 1], arr[i - 1][j]);
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
arr[0][0] = "1"; arr[1][0] = "1"; arr[1][1] = "1";
comb();
cout << arr[N][M];
}'Programming Practice > BOJ' 카테고리의 다른 글
| [BOJ] 백준 1991 트리 순회 (C++) (0) | 2022.04.26 |
|---|---|
| [BOJ] 백준 1932 정수 삼각형 (C++) (0) | 2022.04.24 |
| [BOJ] 백준 15650 N과 M (2) (C++) (0) | 2022.04.20 |
| [BOJ] 백준 1149 RGB거리 (C++) (0) | 2022.04.20 |
| [BOJ] 백준 16236 아기상어 (C++) (0) | 2022.04.19 |