【Python】配列から最大の周囲長を持つ三角形を求めるプログラムの実装方法
問題の概要
正の整数(辺の長さ)からなる配列 nums が与えられたとします。この中から3つの値を選んで三角形を作るとき、その周囲の長さ(perimeter)が最大になる組み合わせを求めます。ただし、面積がゼロより大きい三角形を1つも作れない場合は 0 を返します。
例えば、入力が [8,3,6,4,2,5] の場合、出力は 19 になります。これは、8・6・5 の3辺を選ぶことで 8 + 6 + 5 = 19 の周囲長を持つ三角形が作れるためです。
解き方のアプローチ
この問題は、次の手順で解くことができます。
- リスト
numsを昇順にソートします。 - 末尾から要素を3つ取り出し、それぞれ
a、b、cに代入します(aが最も大きい値になります)。 b + c <= aの間(つまり三角形が成立しない間)、以下の処理を繰り返します。numsが空になったら、三角形を作れないので0を返します。a = b、b = cと値をずらし、cに新しく取り出した末尾の要素を代入します。
- ループを抜けたら、
a + b + cを返します。
なぜこの方法が有効なのか
三角形の成立条件(三角不等式)では、最も長い辺が他の2辺の合計より短くなければなりません。ソート済みのリストで大きい方から3つ選んだときに条件を満たさないなら、それ以外の組み合わせが条件を満たすことはありません。そのため、条件を満たすまで候補を1つずつ下げていくだけで、必ず最大の周囲長が見つかります。計算量はソートに依存し、O(n log n) で効率的に処理できます。
実装例(Python)
以下のコードで実際の動作を確認できます。
def solve(nums):
nums.sort()
a, b, c = nums.pop(), nums.pop(), nums.pop()
while b+c<=a:
if not nums:
return 0
a, b, c = b, c, nums.pop()
return a+b+c
nums = [8,3,6,4,2,5]
print(solve(nums))入力
[8,3,6,4,2,5]
出力
19
-
Pythonで多角形の外周(周囲長)を求めるプログラム
問題の概要2次元平面上にある単純な多角形(自己交差しないポリゴン)の頂点が、順序付きの点のリストとして与えられているとします。このとき、その多角形の外周(周囲長)を求めることが目的です。例として、入力が points = [(0, 0), (0,5), (3, 5), (3,0)] の場合を考えてみましょう。このときの出力は 16 になります。これは、図からも分かるように、長さ3の辺が2本、長さ5の辺が2本存在するためです。したがって、2×5 + 2×3 = 16 となります。アルゴリズムの考え方この問題は、「隣接する2つの頂点間の距離をすべて計算して合計する」というシンプルなアプローチで解く
-
Pythonでリスト内の最大値を見つける方法|sort()とmax()の2つのアプローチ
この記事では、リストの中から最大の数値を見つけるための解決策とアプローチについて詳しく解説します。問題の概要数値のリストが与えられたとき、その中から最大の要素を見つけ出す必要があります。Pythonでは、主に以下の2つの方法でこれを実現できます。ソート(並べ替え)を利用する方法組み込み関数 max() を利用する方法アプローチ1:sort() 関数を使う方法リストを sort() メソッドで昇順に並べ替えると、リストの最後の要素(インデックス -1)が必ず最大値になります。サンプルコードlist1 = [18, 65, 78, 89, 90] list1.sort() # メイン処理 prin