Pythonで3つの数値をすべて0にする最小ステップ数を求める方法
はじめに
3つの整数が与えられたとき、「1回の操作で任意の2つの数からそれぞれ1を引く」というルールに従って、すべての数を0にするまでに必要な最適なステップの総数を求める問題です。
例
入力:
a = 4 b = 4 c = 6
出力:
7
解説:
(4, 4, 6) の状態から、以下の手順で操作を進めます。
- 1番目と2番目の数から1を引く → (3, 3, 6)
- 1番目と3番目の数から1を引く → (2, 3, 5)
- 1番目と3番目の数から1を引く → (1, 3, 4)
- 1番目と3番目の数から1を引く → (0, 3, 3)
- 2番目と3番目の数から1を引く → (0, 2, 2)
- 2番目と3番目の数から1を引く → (0, 1, 1)
- 2番目と3番目の数から1を引く → (0, 0, 0)
このように、すべての数を0にするには合計7ステップ必要であることがわかります。
この問題へのアプローチ
この問題を効率的に解くポイントは、次の通りです。
- まず3つの数を入力として受け取ります。
- sort() 関数を使って、数値を昇順に並べ替えます。
- 最小の2つの数の合計が最大の数より小さい場合、その合計が答えになります(残りの数を0にしきれないため)。
- それ以外の場合は、1回の操作ごとに3つの数の合計が必ず2減るため、全体を0にするのに必要なステップ数は (a + b + c) ÷ 2 となります。
実装例
def maxScore(a: int, b: int, c: int): a, b, c = sorted((a, b, c)) if a + b < c: return a + b return (a + b + c)//2 a=4 b=4 c=6 print(maxScore(a,b,c))
上記のコードを実行すると、次の出力が得られます。
出力
7
入力 a=4、b=4、c=6 の場合、すべての数を0にするには7ステップかかるため、プログラムは正しく「7」を返します。このアルゴリズムはソートと簡単な条件分岐だけで構成されており、計算量も少なく実用的です。
-
Pythonで整数が3の累乗かどうかを判定する方法
ある整数 n が与えられたとき、その数が 3 の累乗(べき乗)であるかどうかを判定する問題を考えてみましょう。例えば、n = 27 は 3 の累乗なので結果は true、一方 n = 15 は 3 の累乗ではないため false となります。この記事では、対数(ログ)を活用したシンプルで効率的な判定方法を解説します。解法のアプローチ:対数を使うこの問題は、以下の手順で解くことができます。常用対数(log10)を利用して判定を行う[log10(n) ÷ log10(3)] の計算結果の小数部分が 0(つまり結果が整数)であれば、n は 3 の累乗であると判定できるこの方法が成り立つ理由は、対数の
-
Pythonで一度だけ現れる数値を見つける方法(XOR演算の活用)
配列Aの中に、2回ずつ出現する数値がたくさん含まれているとします。その中で、たった1つだけ1回しか出現しない要素があります。この要素を配列から見つけ出すのが課題です。例えば、A = [1, 1, 5, 3, 2, 5, 2] の場合、出力は 3 になります。すべての数値が2回ずつ現れるため、XOR(排他的論理和)を使うことで、ペアになる要素を打ち消し合って残りの一意な要素を導き出せます。これは、同じ数値同士のXORが必ず0になるという性質(y XOR y = 0)を利用したテクニックです。さらに、XORには交換法則と結合法則が成り立つため、要素の出現順序に関係なく、同じ数値同士は必ずペアとして