アルゴリズムとプログラミング

基本情報技術者試験スタック・キュー」の問題

アルゴリズムとプログラミングアルゴリズムとプログラミング計算問題難易度:hard
値スタック valStk と最大値スタック maxStk の 2 本を使い、push 時に「これまでの最大値」も同時に積むことで、頂上の最大値を即座に参照できるスタックを作る。push(x) では valStk に x を積み、maxStk には「x と現在の maxStk.top のうち大きい方(maxStk が空なら x)」を積む。pop は両スタックの頂上を同時に取り出す。空の状態から次を実行したとき、最後に maxStk.top が返す値(現在の最大値)はどれか。
○手続: run()
  push(40)
  push(90)
  push(60)
  pop()
  push(20)
  getMax()      // maxStk.top を返す
110(90と20の和とする誤り)
90(現在の最大値)
60
40
正解
90(現在の最大値)

maxStk は各時点の最大値を保持する。60 を pop すると maxStk も縮んで頂上は 90 になり、20 を push しても max(20,90)=90 が積まれる。最終 maxStk.top=90 となるため イが正しい。

?選択肢ごとの解説

ア ×最大値を求めるべきところを最後に積んだ 20 と頂上の 90 を加算して 110 とした、max を和と取り違えた誤りである。
イ ○maxStk は各時点の最大値を保持する。60 を pop すると maxStk も縮んで頂上は 90 になり、20 を push しても max(20,90)=90 が積まれる。最終 maxStk.top=90 となるため イが正しい。
ウ ×pop した値 60 がまだ最大として残っていると誤認した、pop で maxStk も同時に縮む点を見落とした誤りである。
エ ×最初に push した底の値 40 を最大値とした、後続の 90 で最大が更新される点を見落とした誤りである。

くわしく

最大値追跡スタックは、各 push 時点の『その時の最大値』を別スタックに同期して積むことで、pop しても 1 つ前の最大値へ正しく巻き戻せる。max を 1 変数で持つと pop 時に過去の最大へ戻せない点が、補助スタックを使う理由である。

本番での押さえどころ

試験のコツ

valStk と maxStk を 2 列で並べ、push/pop を必ず両方同時に更新して頂上を読む。

覚え方

『値の隣に、その時点の最大も置いておく』とペア記録を覚える。

よくある誤り

max を単一変数で保持し、最大値の要素を pop した後に過去の最大へ戻せないミスが多い。

アルゴリズムとプログラミングの他の問題

この問題を、AIの8-ways解説つきで。

基本情報技術者試験の演習を、一問ごとに「なぜ」まで。まずは無料で。

無料ではじめる →

ukamiru 過去問 · 基本情報技術者試験 · fe-b-algo-0103

【基本情報技術者試験】スタック・キューの問題 — 解答・解説|ukamiru 過去問