Pythonで数値を3桁区切り(カンマ区切り)の文字列に変換するプログラム
数値 n が与えられたとき、その数値を3桁ごとにカンマ(,)で区切った文字列形式に変換して返すことを考えます。
例えば、入力が n = 512462687 の場合、出力は 512,462,687 となります。これは金額や大きな数値を見やすく表示したい場面でよく使われる処理です。
解決の手順
この問題は、以下のステップで解決できます。
- まず
nを文字列に変換し、resとします resを反転させます- 結果を格納するための空文字列
ansを用意します iを 0 からresの長さ - 1 まで繰り返しますiを 3 で割った余りが 0 かつiが 0 でない場合、ansにカンマ「,」を連結します
ansにres[i]を連結します
- 最後に
ansを再び反転させて返します
文字列を一度反転させるのは、桁の下から数えて3桁ごとにカンマを挿入するためです。末尾から処理することで、正しい位置に区切り文字を配置できます。
Pythonでの実装例
理解を深めるために、以下の実装例を見てみましょう。
def solve(n):
res = str(n)
res = res[::-1]
ans = ""
for i in range(len(res)):
if i % 3 == 0 and i != 0:
ans += ','
ans += res[i]
ans = ans[::-1]
return ans
n = 512462687
print(solve(n))入力
512462687
出力
512,462,687
より簡単な方法:format関数を使う
実は Python では、組み込みの書式指定機能を使えばこの処理を1行で実現できます。
n = 512462687
print(f"{n:}") # f文字列の場合
print(format(n, ',')) # format関数の場合
print('{:}'.format(n)) # str.formatメソッドの場合いずれの出力も 512,462,687 となります。実務ではこちらの方法がシンプルで推奨されますが、アルゴリズムの学習目的としては、手動でカンマを挿入する上記の実装もロジック理解の良い練習になります。
-
Pythonでバイナリリスト内の合計がkとなるサブリストの個数を求めるプログラム
問題の概要0と1のみで構成されるバイナリリストが与えられたとします。さらに別の入力として整数 k が与えられ、要素の合計がちょうど k に一致するサブリスト(連続する部分配列)の個数を求める必要があります。例えば、入力が nums = [1, 0, 0, 1, 1, 1, 0, 1]、k = 3 の場合、出力は 8 になります。これは、条件を満たすサブリストとして [1,0,0,1,1]、[0,0,1,1,1]、[0,0,1,1,1,0]、[0,1,1,1]、[0,1,1,1,0]、[1,1,1]、[1,1,1,0]、[1,1,0,1] の8つが存在するためです。解決のためのアプローチこの問題
-
Pythonでn個のノードから構成できる二分探索木(BST)の数を求める方法
問題の概要互いに異なるn個のノードが与えられたとき、それらを二分探索木(BST:Binary Search Tree)として配置する方法が何通りあるかを求めることを考えます。二分探索木には「左部分木には常に親より小さい値が、右部分木には常に親より大きい値が格納される」という重要な性質があります。この問題を解くには、カタラン数(Catalan Number)を利用します。カタラン数 C(n) は、n個の異なるキーから構成できる二分探索木の総数を正確に表すことが知られています。計算式は次のとおりです。$$C(n)=\frac{(2n)!}{(n+1)!\times n!}$$例えば、入力が n =