Pythonで解く「野球ゲーム」スコア計算問題 ― スタックを使った実装方法
野球ゲームの得点記録プログラムを考えてみましょう。文字列のリストが与えられ、各文字列は次の4種類のいずれかであるとします。
- 整数(その回のスコア) ― この回で獲得する得点をそのまま表します。
- "+"(その回のスコア) ― 直前の2つの有効な回の得点の合計が、この回の得点になります。
- "D"(その回のスコア) ― 直前の有効な回の得点を2倍した値が、この回の得点になります。
- "C"(操作であり、スコアではない) ― 直前の有効な回の得点が無効であったことを意味し、その得点を記録から取り消します。
ここで重要なのは、各回の操作が永続的であり、前後の回の計算に影響を及ぼしうるという点です。最終的に、すべての回で獲得できる得点の合計を求める必要があります。
入力例と処理の流れ
たとえば、入力が ["5","2","C","D","+"] の場合、出力は 30 になります。処理は以下のように進みます。
- 1回目 ― 5点を獲得。合計: 5
- 2回目 ― 2点を獲得。合計: 7
- 操作1("C")― 2回目の得点が無効になり、取り消される。合計: 5
- 3回目("D")― 直前の有効な得点5を2倍し、10点を獲得。合計: 15
- 4回目("+")― 直前の2つの有効な得点 5 + 10 = 15点を獲得。合計: 30
解法のアプローチ
この問題はスタック(リスト)を使うことで効率的に解けます。手順は以下の通りです。
- 空のスタックを用意します。
- ops の各要素 i に対して、次の処理を行います。
- i が "+" の場合: スタック末尾の2つの要素を取得し、その合計をスタックに追加します。
- i が "D" の場合: スタック末尾の要素を2倍した値をスタックに追加します。
- i が "C" の場合: スタック末尾の要素を削除(ポップ)します。
- それ以外の場合: i を整数に変換してスタックに追加します。
- 最後に、スタック内の全要素の合計を返します。
スタックを使うことで、「直前の有効な得点」への参照や取り消し操作を O(1) で行えます。全体の計算量は要素数を n とすると時間 O(n)、空間 O(n) となります。
Pythonでの実装例
class Solution:
def calPoints(self, ops):
stack = []
for i in ops:
if i == "+":
first, second = stack[len(stack) - 1], stack[len(stack) - 2]
stack.append(first + second)
elif i == "D":
stack.append(stack[-1] * 2)
elif i == "C":
stack.pop()
else:
stack.append(int(i))
return sum(stack)
ob = Solution()
print(ob.calPoints(["5","2","C","D","+"]))
入力
["5","2","C","D","+"]
出力
30
このように、スタックの「後入れ先出し(LIFO)」という性質を利用すれば、得点の追加・倍加・取り消しといった操作をシンプルかつ効率的に処理できます。類似の問題として、ブラウザの履歴管理やテキストエディタの「元に戻す(Undo)」機能なども同じ考え方で実装できるため、スタックの理解を深める良い練習題材といえるでしょう。
-
Pythonで解く二分木ぬり絵ゲーム ― 後手の勝利判定アルゴリズム
問題概要 二人のプレイヤーが二分木の上でターン制のゲームを行います。二分木の根(root)と、木のノード数nが与えられます。ここでnは奇数であり、各ノードは1からnまでの互いに異なる値を持っています。 まず先手のプレイヤーが1 ≤ x ≤ nを満たす値xを選び、続いて後手のプレイヤーがy ≠ xを満たす値yを選びます。先手は値xのノードを赤色に塗り、後手は値yのノードを青色に塗ります。 その後、先手から始めて交互に手番が進みます。各ターンで、プレイヤーは自分の色(先手なら赤、後手なら青)のノードを1つ選び、その隣接する未着色ノード(左の子・右の子・親のいずれか)を自分の色で塗ります。このような
-
【Python】Tkinterで作るカラーゲーム – 30秒で文字の色を当てるGUIゲーム開発
GUIアプリケーションの開発において、Pythonの標準ライブラリ「Tkinter」は非常に人気が高く、初心者でも扱いやすいツールです。追加のインストール作業なしに使えるため、Tkinterを活用すればシンプルなGUIゲームでも手軽に開発できます。 この記事では、Tkinterを使った「カラーゲーム」の作り方を紹介します。このゲームでは、画面に表示される単語の文字色をプレイヤーが入力し、正解するたびにスコアが1点ずつ加算されます。制限時間は30秒で、使用される色は赤(Red)、青(Blue)、緑(Green)、ピンク(Pink)、黒(Black)、黄(Yellow)、オレンジ(Orange)、