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

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

アルゴリズムとプログラミングアルゴリズムとプログラミング計算問題難易度:hard
次の擬似言語は、文字列 s を左から走査し、スタック頂上と同じ文字が来たら頂上を pop して両者を消し、異なれば push する処理で、隣接した同一文字の対を繰り返し消去する。最後にスタックを底から順に並べた文字列を返す。s = "abbaca"(左から1文字ずつ)を与えて実行したとき、戻り値はどれか。push は積む、pop は取り出す、top は頂上参照、isEmpty は空判定を表す。
○文字列型: removeAdj(文字型の配列: s)
  スタック: stk          // 空で開始
  整数型: i
  for (i を 1 から sの要素数 まで 1 ずつ増やす)
    if (stk.isEmpty が false and stk.top が s[i] と等しい)
      stk.pop()
    else
      stk.push(s[i])
    endif
  endfor
  return スタックを底から順に連結した文字列
"abca"(相殺処理を行わない場合)
"abc"
"aca"
"ca"(連鎖消去後)
正解
"ca"(連鎖消去後)

頂上と同じ文字なら相殺する。abbaca を順に処理すると bb が消え、続いて露出した aa が連鎖的に消え、最後に c と a が残る。底から連結すると "ca" となるため エが正しい。

?選択肢ごとの解説

ア ×隣接同一文字の消去をまったく行わず元に近い "abca" とした、相殺処理を無視した誤りである。
イ ×末尾の a を落として "abc" とした、走査の最後の文字を処理し忘れた誤りである。
ウ ×bb を消した後に露出する aa の連鎖消去を見落とし a を 1 つ残して "aca" とした、連鎖を 1 回で止めた誤りである。
エ ○頂上と同じ文字なら相殺する。abbaca を順に処理すると bb が消え、続いて露出した aa が連鎖的に消え、最後に c と a が残る。底から連結すると "ca" となるため エが正しい。

くわしく

スタックを使うと、ある対を消した結果新たに隣接した同一文字も連鎖的に相殺できる。bb を消した後に露出した a と次の a が相殺する『連鎖消去』がこのアルゴリズムの要点である。

本番での押さえどころ

試験のコツ

スタックの中身を 1 文字処理ごとに更新し、頂上と入力が一致したら消す動きを丁寧に追う。

覚え方

『頂上と同じなら相殺、違えば積む』をペアで唱える。

よくある誤り

消去後に新たに隣り合う文字の相殺を見落とし、1 回分しか消さないミスが多い。

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

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

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

無料ではじめる →

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

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