Pythonで3辺の長さから三角形が成立するかどうかを判定する方法
プログラミングの練習問題としてよく出題されるテーマの一つに、「与えられた3つの辺の長さから三角形が成立するかどうかを判定する」というものがあります。本記事では、Pythonを使ってこの問題をシンプルかつ効率的に解く方法を解説します。
三角形の成立条件(三角不等式)
3つの辺が三角形を形成するためには、「どの2辺の和も残りの1辺より大きくなければならない」という条件、いわゆる三角不等式を満たす必要があります。
例えば、辺のリストが sides = [14, 20, 10] の場合を考えてみましょう。最も長い辺は20ですが、20 < (10 + 14) = 24 となるため、この3辺は三角形を形成できます。したがって、出力は True になります。
解法のアルゴリズム
この問題は、以下の手順で簡単に判定できます。
- まず、辺のリストを昇順にソートします。
- ソート後、最も短い2辺の合計が最も長い辺以下であれば、三角形は成立しません(False を返す)。
- それ以外の場合は、三角形が成立するので True を返します。
ポイントは、リストをソートすることで「最も長い辺」と「残りの2辺」の関係だけを確認すればよくなる点です。これにより、3つの組み合わせすべてを個別にチェックする必要がなくなります。
実装例(サンプルコード)
def solve(sides):
sides.sort()
if sides[0] + sides[1] <= sides[2]:
return False
return True
sides = [14, 20, 10]
print(solve(sides))
入力
[14, 20, 10]
出力
True
コードの解説
solve() 関数では、まず sides.sort() によってリストを昇順に並べ替えています。ソート後、sides[0] と sides[1] が短い方の2辺、sides[2] が最も長い辺となります。もし短い2辺の合計が最長辺以下であれば、その3辺では三角形が閉じられないため False を返します。条件を満たしていれば True を返します。
注意点:等号の扱いについて
判定条件で <=(以下)を使用している点に注目してください。例えば、辺が [5, 5, 10] の場合、5 + 5 = 10 となり、これは「一直線上に並んだ線分」であり、面積ゼロの退化した三角形とみなされます。厳密な意味での三角形としては無効なので、このコードでは False が返されます。もし「退化した三角形も許容したい」場合は、条件を < に変更してください。
まとめ
3辺から三角形の成立を判定する問題は、三角不等式の性質を利用すれば、ソートと一度の比較だけで O(n log n)(実質的には定数時間)で解くことができます。競技プログラミングやコーディング面接でも頻出のパターンなので、ぜひ覚えておきましょう。
-
Pythonで二分木が対称木(シンメトリックツリー)かどうかを判定するプログラム
ある二分木が与えられたとき、その木が対称木(シンメトリックツリー)であるかどうかを判定します。対称木とは、鏡像(左右反転した像)をとったときに元の木と完全に一致するような木のことです。例えば、左右の子部分木が互いに鏡写しの関係になっている木は対称木とみなされます。この判定を行うためのアプローチは以下の通りです。解法の考え方再帰的に処理を行う関数 solve(root, root) を呼び出します。同じノードを2つの引数として渡すのがポイントです。比較対象の2つのノード(node1 と node2)がどちらも空(None)の場合、True を返します。どちらか一方だけが空の場合、構造が一致してい
-
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、または