【Python】FizzBuzz問題の解き方|3と5の倍数を「Fizz」「Buzz」に置き換える
数値 n が与えられたとき、1から n までのすべての数値を表す文字列のリストを作成するプログラムを考えます。ただし、以下のルールに従う必要があります。
- 3で割り切れる場合は、数値の代わりに「Fizz」を出力する
- 5で割り切れる場合は、数値の代わりに「Buzz」を出力する
- 3と5の両方で割り切れる場合は、数値の代わりに「FizzBuzz」を出力する
これはプログラミング学習でよく知られている「FizzBuzz問題」であり、条件分岐とループ処理の基礎を確認するのに最適な題材です。
解き方の手順
この問題は、次の手順で解くことができます。
- 1から n までの各数値について順番に判定を行う
- 3と5の両方で割り切れる場合 → 「FizzBuzz」をリストに追加
- 3のみで割り切れる場合 → 「Fizz」をリストに追加
- 5のみで割り切れる場合 → 「Buzz」をリストに追加
- いずれの条件にも該当しない場合 → 数値をそのまま文字列に変換してリストに追加
ポイントは条件分岐の順序です。「3と5の両方で割り切れる」という条件を必ず最初にチェックしてください。そうしないと、15のような数値が先に「Fizz」と判定されてしまい、正しい結果が得られません。
実装例
それでは、実際のコードを見てみましょう。
class Solution(object):
def fizzBuzz(self, n):
result = []
for i in range(1, n+1):
if i % 3 == 0 and i % 5 == 0:
result.append("FizzBuzz")
elif i % 3 == 0:
result.append("Fizz")
elif i % 5 == 0:
result.append("Buzz")
else:
result.append(str(i))
return result
ob1 = Solution()
print(ob1.fizzBuzz(15))コードのポイント
- 剰余演算子(%)を使うことで、数値がある数で割り切れるかどうかを簡単に判定できます。割り算の余りが0であれば割り切れることを意味します。
- range(1, n+1) により、1から n までの整数を順番に取り出してループ処理を行っています。
- 最後に str(i) を使って数値を文字列に変換し、リスト内の要素の型を統一しています。
入力
15
出力
['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz']
このように、n=15 を入力すると、3の倍数である 3・6・9・12 が「Fizz」に、5の倍数である 5・10 が「Buzz」に、そして15が「FizzBuzz」に置き換えられたリストが出力されます。計算量は O(n) であり、非常に効率的な実装です。
-
Python Pandas – NaNをマスクして特定の値に置き換える方法
Python Pandas – NaNをマスクして特定の値に置き換えるPandasのIndexオブジェクトに含まれるNaN(欠損値)をマスクし、特定の値に一括で置き換えるには、index.putmask()メソッドを使用します。このメソッドの第1引数には、NaNを検出するためのindex.isna()メソッドを指定します。putmask()メソッドは、条件がTrueとなる位置の値を指定した値で置き換える機能を持っています。一方、isna()は各要素がNaNかどうかを判定し、NaNであればTrueを返します。この2つを組み合わせることで、「NaNだけを別の値に置き換える」という処理をシンプルに実
-
Pythonでn個のノードから構成できる二分探索木(BST)の数を求める方法
問題の概要互いに異なるn個のノードが与えられたとき、それらを二分探索木(BST:Binary Search Tree)として配置する方法が何通りあるかを求めることを考えます。二分探索木には「左部分木には常に親より小さい値が、右部分木には常に親より大きい値が格納される」という重要な性質があります。この問題を解くには、カタラン数(Catalan Number)を利用します。カタラン数 C(n) は、n個の異なるキーから構成できる二分探索木の総数を正確に表すことが知られています。計算式は次のとおりです。$$C(n)=\frac{(2n)!}{(n+1)!\times n!}$$例えば、入力が n =