Pythonで数値の各桁の出現頻度がすべて同じかどうかを判定する方法
ある整数 num が与えられたとき、その数値が「バランスしている」かどうかを判定する問題を考えてみましょう。ここで「バランスしている」とは、数値を構成するすべての桁(0〜9)の出現頻度が互いに等しいことを意味します。
たとえば、num = 562256 の場合、各桁は次のように出現します。
- 5 → 2回
- 6 → 2回
- 2 → 2回
すべての桁がちょうど2回ずつ現れているため、この場合の出力は True となります。
解決のアプローチ
この問題は、以下の手順で解くことができます。
- number: 数値
numを文字列に変換します。これにより各桁を簡単に走査できます。 - freq: 各桁の出現回数を記録するマップ(辞書)を作成します。
- freq_values: マップに格納された頻度の値だけを取り出し、セット(集合)を作成します。
- セットのサイズが 1 であれば、すべての桁の頻度が同一であることを意味するため
Trueを返します。 - それ以外の場合は
Falseを返します。
ポイントは、頻度の値をセットに変換することです。セットは重複を許さないため、すべての頻度が同じであれば要素数は必ず1になります。これにより判定処理が非常にシンプルになります。
実装コード
それでは、Pythonでの具体的な実装を見てみましょう。
from collections import defaultdict
def solve(num):
number = str(num)
freq = defaultdict(int)
n = len(number)
for i in range(n):
freq[int(number[i])] += 1
freq_values = set(freq.values())
if len(freq_values) == 1:
return True
return False
num = 562256
print(solve(num))
コードの解説
defaultdict(int)を使うことで、まだ存在しないキーにアクセスした際も自動的に初期値0が設定され、カウント処理が簡潔に書けます。- 文字列に変換した数値を1桁ずつ走査し、
int()で整数に戻してから辞書のカウントを増やしています。 set(freq.values())により頻度の一意な値のみを抽出し、その長さが1かどうかでバランス判定を行っています。
入力
562256
出力
True
計算量について
このアルゴリズムの時間計算量は O(d)、空間計算量も O(d) です(d は数値の桁数)。桁数は最大でも10種類程度しかないため、非常に効率的に動作します。
-
Pythonで二分木のすべてのノードの値が同じかどうかをチェックするプログラム
問題の概要二分木が与えられたとき、その木に含まれるすべてのノードが同じ値を持っているかどうかを判定することを考えます。例えば、次のような二分木が入力として与えられた場合、すべてのノードが同じ値を持っているため、出力は True になります。解決のアプローチこの問題は、再帰を使ってシンプルに解くことができます。以下の手順に従います。solve() 関数を定義します。この関数は root(現在のノード)と val(比較対象の値)を引数として受け取ります。root が null(None)の場合は、True を返します。空の部分木は条件を満たしているとみなせるためです。val が未定義の場合は、ro
-
【Python】配列内のすべての桁を使って3で割り切れる数を作成できるか判定する方法
この記事では、与えられた問題文を解決するための解法とアプローチについて詳しく解説します。 問題文 整数の配列が入力として与えられたとき、これらの数値に含まれるすべての桁を使用して、3で割り切れる整数を作成できるかどうかを判定する必要があります。 ここでは、整数の配列と配列の長さという2つの引数を受け取る関数を作成します。 解法のポイント この実装は、暗算でよく使われる数学的な性質に基づいています。それは次の通りです。 「ある数の各桁の合計が3で割り切れるならば、その数自体も3で割り切れる」 この性質を利用すると、実際に桁を組み合わせて数値を生成する必要はなく、配列内の各要素について3で割った余