Pythonで3つの数の積を求めるプログラム ― 重複する値は除外して計算
3つの数 x、y、z が与えられたとき、それらの積を求める問題を考えてみましょう。ただし、同じ値が2つ以上現れた場合は、その値を計算の対象から除外します。
たとえば、入力が x = 5、y = 4、z = 2 の場合、3つの数はすべて異なるため、出力は 5 * 4 * 2 = 40 となります。
解き方のアプローチ
この問題は、集合(set)を2つ使うことでシンプルに解決できます。1つ目の集合は「これまでに見た値」を記録し、2つ目の集合は「重複しているため除外すべき値」を記録します。
- temp_set := 新しい空の集合(出現した値を記録)
- remove := 新しい空の集合(重複した値を記録)
- [x, y, z] の各要素 i について以下を実行:
- i がすでに temp_set に存在する場合、i を remove に追加する
- i を temp_set に追加する
- remove の各要素 i について、temp_set から i を削除する
- multiplied := 1 と初期化する
- temp_set の各要素 i について、multiplied := multiplied * i を実行する
- multiplied を返す
このアルゴリズムでは、一度でも重複した値は remove 集合に入り、最終的に temp_set から取り除かれます。その結果、temp_set には「1回だけ出現した一意な値」だけが残り、それらの積を計算すれば答えが得られます。
実装例
それでは、実際のコードを見て理解を深めましょう。
class Solution:
def solve(self, x, y, z):
temp_set = set()
remove = set()
for i in [x, y, z]:
if i in temp_set:
remove.add(i)
temp_set.add(i)
for i in remove:
temp_set.remove(i)
multiplied = 1
for i in temp_set:
multiplied *= i
return multiplied
ob = Solution()
print(ob.solve(5, 4, 2))
入力
5, 4, 2
出力
40
補足:動作のポイント
この実装のポイントは、重複チェックをループ内で先に行ってから要素を追加している点です。これにより、同じ値が3つ以上あっても正しく処理されます。また、すべての数が重複して除外された場合、temp_set は空になり、multiplied は初期値の 1 がそのまま返される点にも注意してください。計算量は要素数に対して線形時間 O(n) であり、非常に効率的なアプローチです。
-
Pythonで二分木の全ノードの値の合計を求めるプログラム
二分木(バイナリツリー)にいくつかの値が格納されている場合、木に含まれるすべての値の合計を求めたいことがあります。例えば、次のような二分木が入力として与えられたとします。この場合、出力は 14 になります(2 + 4 + 3 + 5 = 14)。解決のアプローチこの問題を解くには、再帰を使って各ノードを順番に訪問し、値を足し合わせていきます。具体的な手順は以下の通りです。関数 recurse() を定義します。引数としてノードを受け取ります。変数 val に現在のノードの値を代入します。ノードの左の子が存在する場合は、val に左部分木の再帰結果を加算します。ノードの右の子が存在する場合は、v
-
3つの数値から最大値を見つけるPythonプログラム
このチュートリアルでは、3つの数値の中から最大値を求めるPythonプログラムを作成します。3つの数値が与えられたとき、その中で最も大きい数値を見つけることが目標です。まず、理解を深めるためにサンプルのテストケースをいくつか見てみましょう。入力: a, b, c = 2, 34, 4 出力: 34入力: a, b, c = 25, 3, 12 出力: 25入力: a, b, c = 5, 5, 5 出力: 5それでは、3つの数値の中から最大値を求める手順を見ていきましょう。アルゴリズム1. 3つの数値 a、b、c を初期化する。 2. a が b と c の両方より大きければ、a を出力する。