Pythonで配列にある整数の約数がすべて含まれているか確認する方法
問題概要
ある配列 nums が与えられたとき、この配列が「ある整数の約数」をすべて含んでいるかどうかを判定します。
たとえば、入力が nums = [1, 2, 3, 4, 6, 8, 12, 24] の場合、これらはすべて 24 の約数であるため、出力は True になります。
解法のアプローチ
この問題は、次の手順で解くことができます。
- 配列内の最大値を求めます。ある整数の約数リストには必ずその整数自身が含まれるため、配列が完全な約数リストなら、最大値が対象の整数になります。
- 1 から最大値の平方根まで順に調べ、割り切れる数
iを見つけたら、iと商maximum // iを一時リストに追加します。iと商が等しい場合(平方数の場合)は、重複を避けるために商の追加をスキップします。 - 一時リストのサイズが元の配列のサイズと異なる場合は
Falseを返します。 - 両方のリストをソートし、先頭から順に要素を比較します。一致しない要素があれば
Falseを返します。 - すべての要素が一致すれば
Trueを返します。
それでは、実際の実装を見てみましょう。
サンプルコード
from math import sqrt
def solve(nums):
maximum = max(nums)
temp = []
for i in range(1, int(sqrt(maximum)) + 1):
if maximum % i == 0:
temp.append(i)
if (maximum // i != i):
temp.append(maximum // i)
if len(temp) != len(nums):
return False
nums.sort()
temp.sort()
for i in range(len(nums)):
if temp[i] != nums[i]:
return False
return True
nums = [1, 2, 3, 4, 6, 8, 12, 24]
print(solve(nums))入力
[1, 2, 3, 4, 6, 8, 12, 24]
出力
True
計算量のポイント
約数の列挙は最大値 N の平方根まで調べればよいため O(√N)、ソートには O(k log k)(k は配列の長さ)が必要です。全体の計算量は O(√N + k log k) となり、1 から N まで順番にすべて試す素朴な方法 O(N) よりも大幅に効率的です。
-
Pythonで配列が単調(モノトニック)かどうかを判定する方法
この記事では、与えられた配列が「単調(モノトニック)」であるかどうかを判定するための考え方と実装方法について解説します。 問題の定義 n個の整数を含む配列 Arr が入力として与えられます。このとき、その配列が単調な性質を持っているかどうかを判定する必要があります。 配列が単調であるとは、要素が最初から最後まで連続して増加しているか、または連続して減少している状態を指します。つまり、増加と減少が混在していない配列が単調な配列です。 数学的な定義 配列 A が単調増加であるのは、すべての i <= j に対して次の条件が成り立つ場合です。 A[i] <= A[j] 同様に、配列 A
-
Pythonで整数配列の重複を除去し、個別の要素だけを出力する方法
整数型の配列が与えられ、その中には重複した要素が含まれている場合があります。この記事では、重複を取り除いて個別(ユニーク)な値だけを出力するPythonプログラムを解説します。 実行例 入力:A = [1, 2, 3, 4, 2, 3, 5, 6] 出力:[1, 2, 3, 4, 5, 6] アルゴリズム このプログラムは次の手順で動作します。 配列の要素を入力として受け取ります。 各要素を先頭から順番に1つずつ取り出します。 取り出した要素が、それ以前にすでに出力されたものかどうかを確認します。 初期値0のフラグ変数を用意し、すでに表示済みなら1、未表示なら0のままにします。 フラ