본문 바로가기
algorithm/boj

백준 2407 조합

by 권성호 2021. 10. 3.

1. 문제 링크

https://www.acmicpc.net/problem/2407

 

2407번: 조합

n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)

www.acmicpc.net

 

2. 풀이

파스칼의 삼각형에서 제시하는 점화식을 활용해 DP방식으로 풀 수 있다.

문제는 long long 타입조차 감당 안될 정도로 숫자가 커진다는 것.

따라서 숫자 표현을 string으로 해야 한다.

 

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

using namespace std;

int n, m;

string arr[101][101];

string StringPlus(const string& s1, const string& s2) {
	string result = "";
	int tmp;
	auto iter1 = s1.rbegin();
	auto iter2 = s2.rbegin();
	int prev = 0;
	while (iter1 != s1.rend() && iter2 != s2.rend()) {
		tmp = (*iter1 - '0') + (*iter2 - '0') + prev;
		result.push_back((tmp % 10) + '0');
		prev = tmp / 10;
		iter1++; iter2++;
	}
	while (iter1 != s1.rend()) {
		tmp = (*iter1 - '0') + prev;
		result.push_back((tmp % 10) + '0');
		prev = tmp / 10;
		iter1++;
	}

	while (iter2 != s2.rend()) {
		tmp = (*iter2 - '0') + prev;
		result.push_back((tmp % 10) + '0');
		prev = tmp / 10;
		iter2++;
	}

	if(prev != 0)
		result.push_back(prev + '0');

	reverse(result.begin(),result.end());
	return result;
}

int main() {
	cin >> n >> m;
	for (int i = 0; i <= 100; i++) {
		arr[i][0] = "1";
		arr[i][i] = "1";
	}

	for (int i = 2; i <= 100; i++) {
		for (int j = 1; j < i; j++) {
			//arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
			arr[i][j] = StringPlus(arr[i - 1][j - 1], arr[i - 1][j]);
		}
	}

	cout << arr[n][m] << "\n";
}

'algorithm > boj' 카테고리의 다른 글

백준 1967 트리의 지름  (0) 2021.10.05
백준 11779 최소비용 구하기 2  (0) 2021.10.03
백준 13549 숨바꼭질 3  (0) 2021.10.03
백준 2638 치즈  (0) 2021.10.02
백준 1238 파티  (0) 2021.10.02

댓글