Pythonで指定した角度の正多角形を作成できるかどうかを判定する方法
ある角度 a が与えられたとき、その角度をすべての内角とする正多角形を作成できるかどうかを判定する問題を考えてみましょう。
例えば、入力が a = 120 の場合、出力は True になります。これは、正五角形のすべての内角がちょうど120°だからです。
考え方:内角と辺の数の関係
正n角形の内角は、次の公式で求められます。
内角(a) = 180 × (n − 2) ÷ n
この式を n について解くと、次のようになります。
n = 360 ÷ (180 − a)
ここで計算した n(辺の数)が整数になれば、その角度を持つ正多角形が存在することになります。逆に小数になる場合は、その角度をすべての内角とする正多角形は作れません。
アルゴリズムの手順
- sides = 360 ÷ (180 − a) を計算する
- sides に小数部分がない(整数である)場合 →
Trueを返す - それ以外の場合 →
Falseを返す
Pythonでの実装例
def solve(a):
sides = 360 / (180 - a)
if sides == int(sides):
return True
return False
a = 120
print(solve(a))
入力
120
出力
True
補足:動作のポイント
int(sides) は小数点以下を切り捨てた値を返すため、sides == int(sides) が成り立つのは sides が整数のときだけです。例えば a = 60 の場合、sides = 360 / 120 = 3 となり正三角形が作れるため True が返ります。一方、a = 100 の場合は sides = 4.5 となり整数ではないため False が返ります。
なお、内角は180°未満である必要があるため、a >= 180 の入力に対してはゼロ除算や負の値が発生する点に注意してください。実用的には事前に入力値の範囲チェックを追加しておくと安全です。
-
PythonのBST(二分探索木)に指定した合計になるトリプレットが存在するか判定する方法
問題概要 整数値を持つ二分探索木(BST)と、ある数値「total」が与えられたとします。このとき、BSTの中から3つの要素を選び、その合計が「total」と一致するような組み合わせ(トリプレット)が存在するかどうかを判定するのが、本記事のテーマです。 例えば、次のようなBSTが入力として与えられた場合を考えてみます。 total = 12 の場合、出力は True になります。 解法のアプローチ この問題は、BSTを中順走査(inorder traversal)するとノードの値が昇順に並ぶという性質を利用することで、効率的に解くことができます。全体の流れは以下の通りです。 結果を格納する
-
Pythonで点がポリゴンの内側または境界上にあるかどうかを判定するプログラム
問題の概要 直交座標系の点のリスト [(x1, y1), (x2, y2), ..., (xn, yn)] が1つのポリゴン(多角形)を表しているとします。ここに、判定対象となる点 (x, y) が与えられたとき、その点がこのポリゴンの内側、あるいは境界上に存在するかどうかを判定するのが本記事のテーマです。 例として、次のような入力を考えてみましょう。 points = [(0, 0), (1, 3), (4, 4), (6, 2), (4, 0)] pt = (3, 1) この場合、点 (3, 1) はポリゴンの内部にあるため、出力は True となります。 解決のアプローチ この問題は