Pythonで数値を最小個数のデシバイナリ数に分解するプログラム
問題の概要
文字列形式で与えられた数値 n があるとします。このとき、その合計が n と等しくなるような「デシバイナリ数」の最小個数を求める必要があります。デシバイナリ数とは、各桁が 0 または 1 のみで構成される十進数のことです。
例えば、入力が n = "132" の場合、出力は 3 になります。これは、132 が 3 つのデシバイナリ数(10 + 11 + 111)の合計として表せるためです。
解法のアプローチ
この問題を解く鍵は、答えが n の中で最も大きい桁の数字になるという点に気づくことです。
なぜなら、ある桁の数字が d である場合、その桁の合計を d にするには少なくとも d 個のデシバイナリ数が必要だからです(デシバイナリ数の各桁は最大でも 1 しか寄与できません)。逆に、最大の桁の数字と同じ個数だけ用意すれば、すべての桁を必ずカバーできます。
以下の手順で解きます。
resultを 1 で初期化する- 文字列
nの各文字iについて繰り返すiが 0 または 1 以外の場合、resultをresultとiの最大値に更新する
resultを返す
実装例
理解を深めるために、以下の実装を見てみましょう。
def solve(n):
result = 1
for i in n:
if i not in {0,1}:
result = max(result, int(i))
return result
n = "132"
print(solve(n))
入力
132
出力
3
計算量について
時間計算量は O(len(n))、空間計算量は O(1) です。文字列を一度走査するだけで答えが求まるため、非常に効率的なアルゴリズムと言えます。
-
連続する「1」を含まないバイナリ文字列の数を数えるPythonプログラム
この記事では、「連続する1が存在しないバイナリ文字列の総数を求める」という問題の解き方について、Pythonでの実装例を交えながら詳しく解説します。 問題文 問題: 正の整数 N が与えられます。このとき、長さ N のバイナリ文字列(0と1のみで構成される文字列)のうち、連続する「1」が一切含まれないものの総数を求めてください。 例えば N = 3 の場合、有効な文字列は「000」「001」「010」「100」「101」の5つとなり、「011」「110」「111」は連続する1を含むため除外されます。 アプローチ:動的計画法 この問題は動的計画法(DP)を使うことで効率的に解けます。各桁の状態を
-
Pythonで10進数を2進数に変換する方法|再帰と組み込み関数の2つのアプローチ
この記事では、10進数で表された数値を2進数に変換するPythonプログラムについて、その考え方と具体的な実装方法をわかりやすく解説します。 問題文 ある整数が与えられたとき、その数値を2進数に変換します。例えば、10進数の「35」は2進数では「100011」と表現されます。 アプローチ1:再帰を使った解法 再帰処理を利用すると、シンプルなコードで10進数を2進数に変換できます。基本的な流れは以下の擬似コードのとおりです。 DecToBin(num): if num > 1: &n