Pythonで点のリストが同一直線上にあるかどうかを判定するプログラム
デカルト平面(XY座標平面)上の点のリストが与えられたとき、それらの点がすべて同一直線上に並んでいるかどうかを判定するプログラムを作成します。
例えば、入力が coordinates = [(5, 5), (8, 8), (9, 9)] の場合、これら3つの点は傾き1の直線上に並んでいるため、出力は True になります。
解法のアプローチ
すべての点が同一直線上にあるかどうかを確認するには、基準となる2点と他の各点との関係を調べます。具体的には、以下の手順で判定します。
- 最初の2点を基準点として取り出します:(x0, y0) と (x1, y1)
- 3番目以降の各点 (x, y) について、次の条件式をチェックします:
(x0 − x1) × (y1 − y) ≠ (x1 − x) × (y0 − y1)
この等式は「2つのベクトルの外積がゼロであること」、つまり3点が同一線上にあることを表します。この条件が成り立たない場合、その時点でFalseを返します。 - すべての点について条件が満たされれば
Trueを返します。
なお、傾きを直接計算して比較する方法もありますが、分母がゼロになるケース(垂直な直線)での除算エラーを避けるため、外積を使った乗算による比較が安全で推奨されます。
実装例
以下にPythonでの実装例を示します。
class Solution:
def solve(self, coordinates):
(x0, y0), (x1, y1) = coordinates[0], coordinates[1]
for i in range(2, len(coordinates)):
x, y = coordinates[i]
if (x0 - x1) * (y1 - y) != (x1 - x) * (y0 - y1):
return False
return True
ob = Solution()
coordinates = [[5, 5],[8, 8],[9, 9]]
print(ob.solve(coordinates))入力
[[5, 5],[8, 8],[9, 9]]
出力
True
計算量について
このアルゴリズムは点のリストを一度だけ走査するため、時間計算量は O(n)、追加の記憶領域は O(1) で済みます。点の数が多くても効率的に動作します。
-
Pythonでブロックの高さリストが直線y=xに対して対称かどうかを判定するプログラム
数値のリスト nums があるとします。これは正方形のブロックを横一列に並べたときの、各列の高さを表しています。ここで、このブロック形状が直線 y = x に対して対称であるかどうかを判定する必要があります。 たとえば、入力が nums = [7, 5, 3, 2, 2, 1, 1] の場合、出力は True になります。 解き方のアプローチ この問題は、リストの両端から同時に走査していくことで効率的に判定できます。手順は次のとおりです。 i を 0、j を「リストの長さ - 1」で初期化します。 i <= j である間、次の処理を繰り返します。 h := nums[j](右側の
-
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、または