본문 바로가기
프로그래밍/Algorithm

C# [백준 BAEKJOON] 2407번 조합

by bantomak 2024. 3. 4.

문제

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

댓글