Pythonで3辺から直角三角形かどうかを判定する方法
リストとして与えられた3つの辺があるとき、その3辺が直角三角形を構成しているかどうかを判定したいケースはよくあります。
例えば、入力が sides = [8, 10, 6] の場合、8² + 6² = 10² が成り立つため、出力は True になります。
解法の考え方:三平方の定理(ピタゴラスの定理)
この問題は、数学でおなじみの三平方の定理(ピタゴラスの定理)を使えば簡単に解けます。直角三角形では、最も長い辺(斜辺)の2乗が、他の2辺の2乗の和と等しくなるという性質があります。
具体的には、以下の手順で判定を行います。
- まず、辺のリストを昇順にソートし、最も長い辺を
sides[2]に配置する sides[0]² + sides[1]²がsides[2]²と等しい場合はTrueを返す- それ以外の場合は
Falseを返す
実装例
それでは、実際のコードを見てみましょう。
def solve(sides):
sides.sort()
if (sides[0]*sides[0]) + (sides[1]*sides[1]) == (sides[2]*sides[2]):
return True
return False
sides = [8, 10, 6]
print(solve(sides))入力
[8, 10, 6]
出力
True
ポイント解説
このアルゴリズムのポイントは、sides.sort() によって必ず最大の辺がリストの末尾に来るようにしている点です。これにより、どの辺が斜辺になるかを事前に知る必要がなく、常に「短い2辺の2乗の和」と「最長辺の2乗」を比較できます。
計算量はソート部分が O(n log n)(要素数3なら実質定数時間)、比較自体は O(1) なので、非常に効率的です。また、整数同士の比較のため浮動小数点誤差も発生せず、正確な判定が可能です。
-
Pythonで2つの二分木の葉の並び(シーケンス)が同じかどうかを確認する方法
はじめに2つの二分木が与えられたとき、それぞれの木を左から右へたどったときの葉ノードの並び(シーケンス)が一致しているかどうかを判定する問題を考えてみましょう。例えば、次のような2つの木が入力として与えられた場合を想定します。この場合、どちらの木も葉の並びは [2, 6] となるため、出力は True になります。解決のアプローチこの問題を解くためには、以下の手順に従います。結果を格納するための新しいリスト c を用意します。inorder() 関数を定義します。この関数はルートノードとリスト c を引数に取ります。c が null の場合は、新しい空のリストを作成します。ルートノードが nu
-
Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム
2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または