Pythonで配列除去ゲームの勝者を求めるプログラム
AmalとBimalが、いくつかの数値を含む1つの配列Aを使ってゲームを行うことを考えます。ゲームのルールは以下の通りです。
- 必ずBimalが先手です。
- 各ターンで、プレイヤーは配列内の最大要素を削除し、その要素より右側にあるすべての要素も同時に削除します。
- 2人のプレイヤーは交互に手番を行います。
- 残りの要素をすべて取り除いたプレイヤーが勝者となります。
例えば、入力が nums = [5,2,6,3,4] の場合、出力は「Amal」になります。まずBimalが最大要素の6とその右側の要素[3,4]を削除して配列は[5,2]となり、次にAmalが残りの要素をすべて削除するため、勝者はAmalです。
解法のアプローチ
この問題を解くには、以下の手順に従います。
- maximum := -1、count := 0 として初期化します。
- 配列numsの各要素aに対して、以下を繰り返します。
- a > maximum の場合、count を1増やし、maximum := a と更新します。
- 最後に、count を2で割った余りが0(偶数)なら「Amal」を返し、そうでなければ「Bimal」を返します。
このアルゴリズムのポイントは、「左から順に見たときにそれまでの最大値を更新する要素」(接頭辞最大値)の個数を数える点にあります。この個数がゲーム全体の手数と一致するため、その偶奇を調べるだけで勝者を判定できます。
実装例
理解を深めるために、以下の実装を見てみましょう。
def solve(nums):
maximum = -1
count = 0
for a in nums:
if a > maximum:
count += 1
maximum = a
if count % 2 == 0:
return "Amal"
return "Bimal"
nums = [5,2,6,3,4]
print(solve(nums))
入力
[5,2,6,3,4]
出力
Amal
-
Pythonで配列の合計を求める方法を徹底解説
この記事では、Pythonを使って配列(リスト)の合計を求める方法について詳しく解説します。 問題文 問題: 配列が与えられたとき、その配列に含まれるすべての要素の合計を計算してください。 最も基本的なアプローチは、配列全体を走査し、各インデックスの要素を順番に加算していく方法です。ここでは、まず組み込み関数を活用したシンプルな実装例を見ていきましょう。 方法1:組み込み関数 sum() を使う Pythonには、イテラブルなオブジェクトの合計を一発で計算できる組み込み関数 sum() が用意されています。これを使えば、コードは非常に簡潔になります。 サンプルコード # 合計を求める関数 de
-
Pythonで配列(リスト)の合計を求める方法をわかりやすく解説
この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に