基本情報科目B アルゴリズム・擬似言語のトレース対策【問題集付】

皆さんこんにちは!

「科目Bのアルゴリズム問題、難しすぎて時間が足りない……」 「擬似言語のトレースをしていると、途中でわけがわからなくなる……」

ITエンジニアの登竜門**「基本情報技術者試験」。その中でも、多くの受験生が壁にぶつかるのが科目Bのアルゴリズム問題**です。

正直に言います。私も本当に苦しみました。 文系出身でプログラミング経験も浅かったため、最初は解説を読んでもチンプンカンプンだったのです。

しかし、**「あるコツ」**を掴んで対策を変えたところ、驚くほどスラスラ解けるようになりました。

この記事では、私が実際に苦しみながら編み出した**「アルゴリズム完全攻略法」**を解説します。擬似言語の読み方から、絶対にミスしないトレース表の書き方まで、合格に必要なノウハウを全て公開します。

この記事を読み終わる頃には、科目Bに対する苦手意識が消えているはずです!

目次

まずは敵を知る!「擬似言語」の基本ルール

科目Bでは、特定のプログラミング言語ではなく「擬似言語」という共通の表記法が使われます。まずはこのルールを体に染み込ませましょう。

1. これだけは覚える!頻出構文

試験でよく出るのは以下の4つです。これらが組み合わさって問題が作られています。

  • 変数の宣言 (x ← 0):箱(変数)を用意して中身を入れる
  • 条件分岐 (if x = 5 then):もし〜なら、という条件判断
  • 繰り返し (for i ← 1 to 10):決まった回数だけ処理を繰り返す
  • 配列操作 (A[i] ← 5):データの並びを扱う

【重要】ここが落とし穴!配列の添字

初心者が一番ミスしやすいのが配列の添字(インデックス)です。 擬似言語では、配列の始まりが「0」からなのか「1」からなのか、問題文の定義を必ず確認してください。ここを間違えると、トレース結果が全てずれてしまいます。

💡 対策
→ 擬似言語の仕様を確認し、基本的なコードの動作を トレース できるよう練習!

2. 必須アルゴリズムのパターンを理解する

ゼロから考えるのではなく、「よくある型」を知っておくことが時短の鍵です。以下のアルゴリズムは、仕組みを空で言えるレベルにしておきましょう。

  • 探索系
    • 線形探索:頭から順番に探す(単純だが遅い)
    • 二分探索:真ん中で区切って探す(高速だが、データがソート済みである必要がある)
  • ソート系(整列)
    • 選択ソート・バブルソート:基本の並べ替え
    • クイックソート:分割統治法を使った高速な並べ替え
  • データ構造
    • スタック:後入れ先出し(LIFO)
    • キュー:先入れ先出し(FIFO)

💡 ポイント 暗記するのではなく、「なぜこの処理が必要なのか?」という処理の流れを理解しましょう。特に二分探索やクイックソートは頻出です!

3.合格の鍵は「手書きトレース」にあり!

ここが今日一番伝えたいことです。頭の中だけで計算しようとしていませんか? 人間の脳は、変数の値が3回変化しただけで混乱するようにできています。必ず「トレース表」を書きましょう。

最強のトレース表の書き方

面倒くさがらず、以下のような表を余白に書く癖をつけてください。

行番号変数 i変数 j配列 A[i]備考・出力
105初期化
2105ループ開始
31110値が更新された

トレースのコツ:

  1. 1行ずつ実行する: プログラムの行を指で追いながら進める
  2. 値の変化を全部書く: 上書きせず、新しい行に追加していく(履歴を残す)
  3. 条件分岐を丁寧に: if文の条件がTrueかFalseか、横にメモする

これを徹底するだけで、ケアレスミスは激減します。

4.【実践】実際にトレース問題を解いてみよう

「トレース表を書けと言われても、具体的にどうやるの?」という方のために、簡単な例題を用意しました。 紙とペンを用意して、私と一緒にやってみましょう!

例題:配列の集計

次のプログラムを実行したとき、最後に出力される sum の値はいくつになるでしょうか? ※配列の添字(インデックス)は0から始まるものとします。

整数型の変数 sum ← 0
整数型の配列 A ← {2, 5, 1, 8}
整数型の変数 i

For i ← 0 to 3  // 0から3まで繰り返す
    If A[i] > 4 Then  // もしA[i]が4より大きければ
        sum ← sum + A[i]
    EndIf
EndFor

出力 sum

いきなり答えを出そうとせず、1行ずつ表に書き写していきます。

解説とトレース表

【手書きトレースの手順】

  1. 初期状態: sum は0です。
  2. i=0 のとき: A[0] は「2」です。「2 > 4」はFalse(成立しない)なので、何もしません。
  3. i=1 のとき: A[1] は「5」です。「5 > 4」はTrue(成立する)なので、sum に5を足します。(sumは5になる)
  4. i=2 のとき: A[2] は「1」です。条件不成立。スルーします。
  5. i=3 のとき: A[3] は「8」です。「8 > 4」はTrueなので、sum(現在は5)に8を足します。(sumは13になる)

これを表にまとめると、以下のようになります。

iA[i]条件 ( > 4 )sum備考
10初期化
202× (No)0変化なし
315○ (Yes)50 + 5
421× (No)5変化なし
538○ (Yes)135 + 8

答え: 13

どうでしょう? 頭の中で「2はダメで、5は足して、1はダメで…」とやると、途中で今の合計値がわからなくなりがちです。

しかし、表に書けば**「今のsumは5だな」**と一目でわかり、安心して次の計算に進めます。

これがトレース表の威力です!

では次の章で練習問題をといていきましょう!

5.科目B アルゴリズム演習問題集(全10問)

※すべての問題において、配列の添字(インデックス)は「0」から始まるものとします。

【レベル1:基礎・ループ・条件分岐】

まずは基本の動きを確認しましょう。

第1問:条件付き合計(基本)

以下のプログラムを実行したとき、出力される値はいくつですか?

整数型の変数 sum ← 0
整数型の配列 A ← {10, 5, 8, 3, 12}
整数型の変数 i

For i ← 0 to 4
    If A[i] >= 10 Then
        sum ← sum + A[i]
    EndIf
EndFor
出力 sum
解答と解説をみる

答え:22

  • 解説: 配列の中で「10以上」の数字だけを足し合わせます。
  • 対象になるのは 1012 です。
  • 10 + 12 = 22
第2問:最大値の探索(配列)

以下のプログラムを実行したとき、出力される値はいくつですか?

整数型の変数 maxVal ← 0
整数型の配列 A ← {3, 9, 15, 6, 2}
整数型の変数 i

maxVal ← A[0]  // 最初の要素を仮の最大値とする

For i ← 1 to 4
    If A[i] > maxVal Then
        maxVal ← A[i]
    EndIf
EndFor
出力 maxVal
解答と解説をみる

答え:15

  • 解説: 配列の中から一番大きい数字を見つける典型的なアルゴリズムです。
  • 変数 maxVal が、より大きい数字に出会うたびに更新されていきます。
第3問:FizzBuzz風(剰余算)

以下のプログラムを実行したとき、出力される値はいくつですか? ※ x % y は x を y で割った余りを表します。

整数型の変数 count ← 0
整数型の変数 i

For i ← 1 to 10
    If (i % 2 = 0) and (i % 3 = 0) Then
        count ← count + 1
    EndIf
EndFor
出力 count
解答と解説をみる

答え:1

  • 解説: 1から10までの間で、「2で割り切れ、かつ3でも割り切れる数(つまり6の倍数)」を数えます。
  • 該当するのは「6」だけなので、カウントは1回です。

【レベル2:探索・ソート・文字列】

ここから試験によく出るパターンです。トレース表が必須になります。

第4問:線形探索(Break)

以下のプログラムを実行したとき、出力される pos の値はいくつですか?

整数型の配列 A ← {4, 2, 7, 5, 9}
整数型の変数 target ← 7
整数型の変数 pos ← -1
整数型の変数 i

For i ← 0 to 4
    If A[i] = target Then
        pos ← i
        Break  // ループを抜ける
    EndIf
EndFor
出力 pos
解答と解説をみる

答え:2

  • 解説: 配列の中から「7」を探します。
  • A[0]=4, A[1]=2, A[2]=7 なので、i が 2 の時に見つかります。
  • 答えは値そのものではなく、添字(インデックス)の 2 になります。
第5問:文字列操作(文字数カウント)

以下のプログラムを実行したとき、出力される n の値はいくつですか? ※ S[i] は文字列Sのi番目の文字を表します。

文字列型の変数 S ← "banana"
整数型の変数 n ← 0
整数型の変数 i

For i ← 0 to 5
    If S[i] = "a" Then
        n ← n + 1
    EndIf
EndFor
出力 n
解答と解説をみる

答え:3

  • 解説: 文字列 “banana” の中に “a” がいくつあるかを数えます。
  • b-a-n-a-n-a なので、3個です。
第6問:選択ソート(途中経過)

以下のプログラムは、配列を小さい順(昇順)に並べ替えるものです。 **「外側のループが1回終了した時点」**での配列Aの状態はどうなっていますか?

Plaintext

整数型の配列 A ← {5, 3, 8, 1}
// 最小値を見つけて先頭と交換する処理
解答と解説をみる

答え:{1, 3, 8, 5}

  • 解説: 選択ソートの最初のステップは、「配列全体から最小値を探し、一番左と交換する」です。
  • {5, 3, 8, 1} の中で最小値は 1 です。
  • 先頭の 51 を交換するので、{1, 3, 8, 5} になります。
第7問:二分探索(比較回数)

ソート済みの配列 {1, 3, 5, 7, 9, 11, 13} から、二分探索を用いて値 9 を探します。 値の比較は何回行われますか?

解答と解説をみる

答え:2回

  • 解説:
    1. まず真ん中の要素を見ます。要素数は7個なので、真ん中は4番目の 7 です。探している 9 はこれより大きいです。(比較1回目)
    2. 右半分 {9, 11, 13} の真ん中を見ます。真ん中は 11 です。探している 9 はこれより小さいです。(比較2回目)
    3. ※この問題は実装によって2回か3回か微妙に変わりますが、試験では「真ん中と比較→絞り込み」の流れが問われます。
    • (別解釈の一般的な動き)
      1. Mid=7 (target > 7) -> 右へ
      2. Mid=11 (target < 11) -> 左へ
      3. Mid=9 (target = 9) -> 一致 (ここで3回目とする場合もありますが、IPAのトレース問題では2回目で一致して終了、あるいは範囲を絞る回数を問うことが多いです)
    • ブログ用の簡易解説:
      1. 真ん中の 7 と比較 → 9の方が大きいので右半分へ。
      2. 右半分 {9, 11, 13} の真ん中 11 と比較 → 9の方が小さいので左へ。
      3. 残った 9 と比較して終了。

【レベル3:データ構造・その他】

第8問:スタック(LIFO)

空のスタック(Stack)に対して、以下の操作を行いました。最後に Pop して取り出される値はいくつですか? ※Push:入れる、Pop:出す

  1. Push(5)
  2. Push(10)
  3. Pop()
  4. Push(7)
  5. Pop()
解答と解説をみる

答え:7

  • 解説: スタックは「後入れ先出し(上から取る)」です。
    1. [5]
    2. [5, 10]
    3. 10を取り出す → [5]
    4. [5, 7]
    5. 7を取り出す
第9問:キュー(FIFO)

空のキュー(Queue)に対して、以下の操作を行いました。最後に Dequeue して取り出される値はいくつですか? ※Enqueue:入れる、Dequeue:出す

  1. Enqueue(A)
  2. Enqueue(B)
  3. Dequeue()
  4. Enqueue(C)
  5. Dequeue()
解答と解説をみる

答え:B

  • 解説: キューは「先入れ先出し(行列の先頭から出る)」です。
    1. [A]
    2. [A, B]
    3. Aが出る → [B]
    4. [B, C]
    5. Bが出る
第10問:入れ替え(スワップ)

変数 x = 10, y = 20 です。この2つの値を入れ替えて x = 20, y = 10 にしたいとき、空欄( a )に入る適切な処理はどれですか? なお、t は一時的な変数とします。

Plaintext

t ← x
x ← y
(  a  )
解答と解説をみる

答え: y ← t

  • 解説: 三角トレードの要領です。
    1. tx(10) を退避させる。
    2. xy(20) を上書きする。(この時点でxの元の値は消えるため、tが必要)
    3. yt(10) を入れる。

6. 過去問演習で「時間の壁」を越える

知識がついたら、あとは実戦形式で慣れるだけです。

おすすめの学習リソース

IPA公式サイトのサンプル問題:まずはここから。公式が出している「指標」です。
過去問演習サイト(無料):スマホでスキマ時間に解くのに最適。
参考書(スクール教材):解説が丁寧なものを1冊やり込みましょう

時間を意識したトレーニング

慣れてきたら**「1問あたり5分〜7分」**を目安に解く練習をしましょう。

科目Bは100分で20問を解く必要があります。単純計算で1問あたり平均5分しかありません。

  • セキュリティ問題など(読めば解ける問題): 2〜3分で瞬殺して時間を稼ぐ
  • 重たいアルゴリズム問題: 7〜10分かけて慎重に解く

このような「時間のメリハリ」をつける練習が、合否を分けます。ハマってしまった問題は「捨てる(適当に選んで次へ進む)」勇気も必要です。

まとめ:手を動かした分だけ、確実に伸びる!

科目Bのアルゴリズム対策まとめです。

  1. 擬似言語のルール(特に配列の添字)を完璧にする
  2. 代表的なアルゴリズム(探索・ソート)の動きを理解する
  3. トレース表を必ず手書きして、変数の変化を可視化する
  4. 時間を計って過去問を解き、試験勘を養う

アルゴリズムは「才能」ではなく、「正しい手順」を知っているかどうかで決まります。 諦めずに手を動かし続ければ、必ず解けるようになります。

さあ、今すぐ参考書を開いて、まずは1問、トレース表を書きながら解いてみましょう!あなたの合格を心から応援しています!💪

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

バーテンダー→1部上場企業→フリーランス。フリーランスで月収100万円をかなえるために全力で駆け抜けています
実体験をもとに日々のWEB制作の記録を発信していきます
まだまだなのでご指導ご鞭撻のほどよろしくお願いいたします

コメント

コメントする

目次