【Python】停車駅の組み合わせ問題を解くプログラム
本記事では、次の問題に対するPythonでの解き方を詳しく解説します。
問題設定
問題文: 地点Aと地点Bの間に13の中間駅があるものとします。このとき、列車が2つの中間駅に停車する方法のうち、選んだ2駅が隣接しない(連続しない)ような組み合わせが何通りあるかを求めます。
解法のポイント
n個の中間駅から、互いに隣接しないp個の駅を選ぶ方法の総数は、組合せの公式を使って次のように表せます。
C(n − p + 1, p)
今回の場合は n = 13、p = 2 なので、C(12, 2) = 66 通りという答えになります。
実装例
# 停車駅の組み合わせを求める関数
def stopping_station(p, n):
num = 1
dem = 1
s = p
# 分母:p の階乗を計算
while p != 1:
dem *= p
p -= 1
# 分子:(n - s + 1) から順に積を計算
t = n - s + 1
while t != (n - 2 * s + 1):
num *= t
t -= 1
if (n - s + 1) >= s:
return int(num / dem)
else:
# 条件を満たす選び方が存在しない場合
return -1
# メイン処理
num = stopping_station(2, 13)
if num != -1:
print("停車駅の組み合わせ数:", num)
else:
print("条件を満たす組み合わせは存在しません")
出力結果
停車駅の組み合わせ数: 66
コードの解説
使用している変数はすべてローカルスコープで宣言されており、それぞれの役割は以下のとおりです。
- s / p: 停車させる駅の数(今回は2)
- n: 中間駅の総数(今回は13)
- dem: 組合せ計算の分母(p の階乗)
- num: 組合せ計算の分子
- 戻り値 -1: 条件を満たす組み合わせが存在しないことを示す値
「(n − s + 1) >= s」という条件判定により、非連続でp駅を選ぶことが物理的に可能かどうかをチェックしています。駅の数が足りず選び方が存在しない場合は -1 を返し、呼び出し元でその旨を表示します。
まとめ
本記事では、Pythonを使って「停車駅の組み合わせ」問題を解く方法を学びました。組合せの公式 C(n − p + 1, p) を活用することで、隣接しない駅の選び方を効率的に求められます。この考え方は、間隔を空けて対象を選ぶ問題全般に応用できるため、座席配置やスケジューリングなどの課題にも役立ちます。
-
Pythonでn番目のカタラン数を計算するプログラム|再帰法と動的計画法
本記事では、n番目のカタラン数を計算する方法について解説します。 カタラン数(Catalan number)は、次の漸化式で定義される自然数の数列です。 $$C_{0}= 1,\quad C_{n+1}=\displaystyle\sum\limits_{i=0}^n C_{i}C_{n-i}\quad (n \geq 0)$$ n = 0, 1, 2, 3, … に対するカタラン数は、1, 1, 2, 5, 14, 42, 132, 429, … と続きます。 カタラン数は、再帰法と動的計画法のどちらのアプローチでも求めることができます。それでは、それぞれの実装方法を見ていきましょう。 方法
-
【Python】与えられた数がフィボナッチ数かどうかを判定する方法を解説
本記事では、以下の問題文に対する解決策について詳しく学んでいきます。 問題の定義 数値 n が与えられたとき、その数がフィボナッチ数であるかどうかを判定します。 ご存知のとおり、n番目のフィボナッチ数は「直前の2つのフィボナッチ数の和」として定義されます。しかし、この漸化式以外にも、フィボナッチ数には興味深い数学的な性質が存在します。 フィボナッチ数の判定に使える重要な性質 ある数 n がフィボナッチ数であるのは、次の条件が成り立つ場合、かつその場合に限られます。 5×n² + 4 が完全平方数である または 5×n² − 4 が完全平方数である つまり、上記のどちらか一方(または両方)が