문제
nCm을 출력한다.
입력
n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)
출력
nCm을 출력한다.
2407번: 조합
n과 m이 주어진다. (5 ≤ n ≤ 100, 5 ≤ m ≤ 100, m ≤ n)
www.acmicpc.net

풀이 코드
해당 문제를 풀이하기 위해선 큰 수 더하기, 조합, 메모이제이션을 익혀야 한다. 하나씩 익히면서 풀어보자.
using System;
using System.Linq;
using System.Text;
class Program
{
static void Main(string[] args)
{
string[,] ss = new string[101, 101];
var input = Console.ReadLine().Split();
var num1 = Int32.Parse(input[0]);
var num2 = Int32.Parse(input[1]);
Console.WriteLine(Combination(ss, num1, num2));
}
static string BigNumerAdd(string num1, string num2)
{
StringBuilder sb = new StringBuilder();
int carry = 0;
var s = "";
if (num1.Length <= num2.Length)
{
for (int i = 0; i < num2.Length - num1.Length; i++)
{
s += "0";
}
num1 = s + num1;
}
else
{
for (int i = 0; i < num1.Length - num2.Length; i++)
{
s += "0";
}
num2 = s + num2;
}
for (int i = num1.Length - 1; 0 <= i; i--)
{
var digit1 = num2[i] - '0';
var digit2 = num1[i] - '0';
var prevCarry = 0;
if (carry > 0)
{
prevCarry++;
carry = 0;
}
if (10 <= digit1 + digit2 + prevCarry)
{
carry++;
}
sb.Append((digit1 + digit2 + prevCarry) % 10);
}
if (carry > 0)
{
sb.Append(1);
}
return new string(sb.ToString().Reverse().ToArray());
}
static string Combination(string[,] ss, int n, int r)
{
if (ss[n, r] != null)
{
return ss[n, r];
}
else if (n == r || r == 0)
{
ss[n, r] = "1";
}
else
{
ss[n, r] = BigNumerAdd(Combination(ss, n - 1, r - 1), Combination(ss, n - 1, r));
}
return ss[n, r];
}
}
Combination 함수에서 알수 있는 조합의 성질
조합의 성질에 대해서
조합(Combination)의 성질 예를 들어, 10개의 서로 다른 사탕 중 3개를 뽑아서 먹어버리면 7개가 남게 된다. 즉, 10개 중에 3개를 뽑는 방법의 수와 10개 중 7개를 남기는 방법의 수는 같다. 첫 번째 성질
jettstream.tistory.com
메모화로 최적화 하기
C# 메모화(Memoization)
메모화란 무엇인가? 코드 최적화를 위해 메모화(memoization) 기법을 적용할 수 있다. 메모화는 특정 입력 값에 대한 함수의 처리 결과를 기억하는 과정이라고 할 수 있다. 즉, 특정 함수에 입력 값
jettstream.tistory.com
참고하면 좋은 글
[백준 BAEKJOON] 10757번 큰 수 A+B
문제 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000) 출력 첫째 줄에 A+B를 출력한다. 2407번: 조합 n과 m이 주어진다. (5 ≤
jettstream.tistory.com
[백준 BAEKJOON] 6603번 로또
문제 독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다. 로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는
jettstream.tistory.com
'프로그래밍 > Algorithm' 카테고리의 다른 글
C# [백준 BAEKJOON] 10951번 A+B - 4 (0) | 2024.03.07 |
---|---|
C# [백준 BAEKJOON] 15649번 N과 M (1) (0) | 2024.03.06 |
C# [백준 BAEKJOON] 10757번 큰 수 A+B (0) | 2024.03.04 |
[백준 BAEKJOON] 14928번 큰 수 (BIG) (0) | 2024.02.26 |
[백준 BAEKJOON] 6603번 로또 (2) | 2024.02.26 |
댓글