Pythonで数の三角形の行lにおける最初の偶数の位置を求めるプログラム
数の三角形とは
本記事で扱うのは、次のような規則で生成される「数の三角形」です。
1
1 1 1
1 2 3 2 1
1 3 6 7 6 3 1
この三角形では、各行の要素はその真上にある3つの数を足し合わせることで生成されます。両端の要素については、真上に存在する数だけが加算されます。
問題の定義
行番号 l が与えられたとき、その行に最初に現れる偶数が何番目にあるかを求めます。位置は 1から始まる ものとします。
例えば、l = 5 の場合、答えは 2 になります。実際に5行目まで書き出すと次のようになります。
1
1 1 1
1 2 3 2 1
1 3 6 7 6 3 1
1 4 10 16 19 16 10 4 1
5行目は「1, 4, 10, 16, 19, 16, 10, 4, 1」と並んでおり、最初の偶数である 4 は 2番目 に位置しています。
解法のアプローチ
この問題は、行番号 l の偶奇性に着目することで、三角形を実際に構築しなくても定数時間で答えを求められます。偶数が現れる位置は l を 4 で割った余りによって周期的なパターンを持つためです。手順は以下の通りです。
- l が 1 または 2 の場合: 行全体が奇数だけで構成されているため、
-1を返します。 - l が偶数の場合:
- l が 4 で割り切れるなら
3を返します。 - それ以外(l を 2 で割った商が奇数)なら
4を返します。
- l が 4 で割り切れるなら
- l が奇数(3 以上)の場合:
2を返します。
Pythonでの実装例
それでは、実際のコードを見てみましょう。
def solve(l):
if l == 1 or l == 2:
return -1
elif l % 2 == 0:
if l % 4 == 0:
return 3
else:
return 4
else:
return 2
l = 5
print(solve(l))
入力と出力
入力:
5
出力:
2
計算量について
この解法は条件分岐のみで構成されているため、時間計算量・空間計算量ともに O(1) です。三角形を行ごとに生成して走査する方法では O(l²) の計算が必要になりますが、本手法では行番号がどれほど大きくなっても即座に答えを導き出せる点が大きな利点です。
-
Pythonで最初のノードから最後のノードまでの制限付きパスの数を求めるプログラム
無向の重み付き連結グラフがあるとします。グラフは n 個のノードを持ち、それぞれのノードには 1 から n までのラベルが付けられています。始点から終点へのパスとは [z0, z1, z2, ..., zk] のようなノードの列のことで、z0 が始点ノード、zk が終点ノードであり、隣り合うノード zi と zi+1 の間(0 ≤ i ≤ k-1)には必ず辺が存在します。パスの距離は、そのパスが通る辺の重みの総和として定義されます。また、dist(x) は「ノード n からノード x までの最短距離」を表すものとします。制限付きパス(restricted path)とは、すべての i(0 ≤
-
Pythonでリスト内の最大値を見つける方法|sort()とmax()の2つのアプローチ
この記事では、リストの中から最大の数値を見つけるための解決策とアプローチについて詳しく解説します。問題の概要数値のリストが与えられたとき、その中から最大の要素を見つけ出す必要があります。Pythonでは、主に以下の2つの方法でこれを実現できます。ソート(並べ替え)を利用する方法組み込み関数 max() を利用する方法アプローチ1:sort() 関数を使う方法リストを sort() メソッドで昇順に並べ替えると、リストの最後の要素(インデックス -1)が必ず最大値になります。サンプルコードlist1 = [18, 65, 78, 89, 90] list1.sort() # メイン処理 prin