【Python】組合わせ:9人をグループに分ける方法が何通りか調べる

■概要

9人をグループに分ける方法が何通りになるのか、机上計算およびPythonを使用した計算処理の2種類の解答方法を示す。

■組合せ

組合せとは、並び方、順番は関係なく、ある集団からいくつかを選択する方法である。

上図の場合、1〜6の玉から、2つを取り出しているが、「②と⑤」も「⑤と②」も区別しない。

▼組合せの公式

組合せの計算は、順列の計算を行い、そこからダブりの場合の数を割ることで求めることができる。

▼参考

・順列の計算

■例題

9人を以下の問1、問2のようにグループに分ける方法が何通りになるのか調べる。

▼問1

4人、3人、2人の3つのグループに分ける場合の数を求める。

▼問2

A、B、Cの各部屋に3人ずつ分ける場合の数を求める。

■机上計算

▼問1

9人を4人、3人、2人の3つのグループに分ける場合の数を求める方法は以下の通り。

▼問2

9人をA、B、Cの各部屋に3人ずつ分ける場合の数を求める。

■Pythonによる実装

▼フローチャート

組合せを計算する関数について、フローチャートを下図に示す。

▼プログラム仕様

<処理名:重複順列を計算する関数>

・引数と戻り値

項目内容
第1引数int型nCrの「n」
第2引数int型nCrの「r」
戻り値int型nCrの計算結果

・処理概要

入力処理内容出力
一時変数にnとrを格納する。
nPrとr!の初期値をセットする。
・初期値
nPr:1
r!:1
■ループ処理:rの回数分繰り返し
|nPrとr!の値を算出する。
|一時変数をデクリメントする。
nCrを計算する。
戻り値を返す。(int型)

▼サンプルコード

# 組合せを計算する関数
def cal_combination(n: int, r: int) -> int:
    # 一時変数にnとrを格納
    tmp_n = n
    tmp_r = r

    # nPrとr!の初期値をセット
    n_P_r = 1
    r_kaijo = 1

    # rの回数分繰り返し
    for _ in range(r):
        # nPrとr!の値を算出
        n_P_r = n_P_r * tmp_n
        r_kaijo = r_kaijo * tmp_r

        # 一時変数をデクリメント
        tmp_r -= 1
        tmp_n -= 1
    
    # nCrの計算
    n_C_r = n_P_r / r_kaijo

    # 戻り値を返す(int型)
    return int(n_C_r)


if __name__ == '__main__':
    # 問1:4人、3人、2人に分ける
    print('問1:', cal_combination(9, 4) * cal_combination(5, 3) * cal_combination(2, 2), '通り')

    # 問2:3人ずつを3つの部屋に入れる
    print('問2:', cal_combination(9, 3) * cal_combination(6, 3) * cal_combination(3, 3), '通り')

▼実行結果

問1: 1260 通り
問2: 1680 通り

コメント