基本情報技術者 学習ページ|科目B・アルゴリズムとプログラミング

アルゴリズムを読む

整列、探索、再帰、文字列処理は、処理の目的と一回の操作をつかむと追跡しやすくなります。このページでは、代表的なアルゴリズムを擬似言語で読み、比較回数や変数の変化から空欄と結果を判断します。

流れ図を追う

流れ図では、処理、判断、繰返しの流れを矢印に沿って追います。判断では条件が真の経路と偽の経路を区別し、合流後の処理まで確認します。

擬似言語へ置き換えて考えると、判断はif、反復はforやwhileに対応します。戻り矢印がどの条件へ戻るかを見失わないことが大切です。

分岐の直後で変数がどう変わるかを書き添えると、経路ごとの差が見えます。

流れ図は分岐先と戻り先を矢印で確認する。

三つの整列法

選択ソートは未整列部分から最小値などを探して所定位置と交換します。バブルソートは隣り合う要素を比較し、順序が逆なら交換します。挿入ソートは取り出した値を、整列済み部分の適切な位置へ差し込みます。

一回の外側ループで何が進むかを見ると、三つの方法を区別しやすくなります。選択ソートとバブルソートは、外側ループ1回ごとに端の位置が1つ確定します。挿入ソートは整列済みの範囲が1つずつ広がりますが、その中の値は後から動くことがあります。

外側ループが1回終わるごとに配列の並びを1行ずつ書き出すと、どこから整列済みになっていくかが見えます。

選択・バブルは端が1つずつ確定、挿入は整列済み範囲が広がる。

線形探索と2分探索

線形探索は先頭などから順に値を比較します。2分探索は整列済みの配列で中央要素と比較し、探索範囲を半分側へ狭めます。

2分探索ではleft、right、midの三つを表にして追います。整列されていない配列には、同じ手順で2分探索を適用できません。

探索範囲が縮まる向きまで確認すると、leftとrightの更新を逆にしにくくなります。

2分探索は整列済み配列で探索範囲を半分に狭める。

再帰は小さくする

再帰は、関数が自分自身を呼び出す形です。読むときは、呼出しを止める条件と、次の呼出しでその条件へ近づくことを確認します。

例えばnを1ずつ減らす、配列の対象範囲を狭めるなど、停止条件へ近づく変化が必要です。戻り値は最も深い呼出しから順に戻して計算します。

呼出しごとの引数を縦に並べると、停止条件へ近づいているかを確認できます。

再帰は停止条件と、そこへ近づく変化を確認する。

文字列処理を分解

文字列処理では、1文字ずつ調べる操作や一致区間を探す操作を、問題文で定義された関数に分けて読むことがあります。文字の取り出し規則が独自に示されたら、その定義を先に確認します。

照合処理では、比較する位置、何文字一致したか、ずれたときにどこから再開するかを追います。問題文の関数定義を擬似言語より先に整理します。

文字列は問題文で定義された操作の意味を先に確認する。

本番の形で解いてみる

科目Bの形: プログラム(擬似言語)を読んで解答群から選ぶ(このページのために作った問題)

次のプログラム中の【a】、【b】に入れる正しい答えの組合せを、解答群の中から選べ。関数selectSortは整数型の配列aを昇順に並べ替えて返す。要素番号は1から始まる。

 1○整数型の配列: selectSort(整数型の配列: a)
 2  整数型: i, j, minPos, temp
 3  for (i を 1 から aの要素数 - 1 まで 1 ずつ増やす)
 4    minPos ← i
 5    for (j を i + 1 から aの要素数 まで 1 ずつ増やす)
 6      if (a)
 7        minPos ← j
 8      endif
 9    endfor
10    temp ← a[i]
11    a[i] ← a[minPos]
12    b
13  endfor
14  return a
  1. a: a[j] < a[minPos] b: a[minPos] ← temp
  2. a: a[j] > a[minPos] b: a[minPos] ← temp
  3. a: a[j] < a[i] b: a[j] ← temp
  4. a: j < minPos b: a[minPos] ← temp
  5. a: a[j] < a[minPos] b: a[i] ← temp
答えと解説を見る

正解: a: a[j] < a[minPos] b: a[minPos] ← temp

未整列部分の最小値の位置をminPosに記録するので、a[j]が現在の最小値より小さいとき更新します。最後はa[i]とa[minPos]を交換するため、a[minPos]へtempを入れます。

まちがえやすい点: 最小値そのものではなく、その位置minPosを更新している。

科目Bの形: プログラム(擬似言語)を読んで解答群から選ぶ(このページのために作った問題)

次のプログラム中の【a】、【b】に入れる正しい答えの組合せを、解答群の中から選べ。関数binaryFindは、昇順で重なりのない整数型配列aとtargetを受け取り、targetがあればその要素番号、なければ0を返す。

 1○整数型: binaryFind(整数型の配列: a, 整数型: target)
 2  整数型: left ← 1
 3  整数型: right ← aの要素数
 4  整数型: mid
 5  while (left ≦ right)
 6    mid ← (left + right) ÷ 2 の商
 7    if (a[mid] = target)
 8      return mid
 9    elseif (a[mid] < target)
10      a
11    else
12      b
13    endif
14  endwhile
15  return 0
  1. a: left ← mid + 1 b: right ← mid - 1
  2. a: left ← mid b: right ← mid
  3. a: right ← mid - 1 b: left ← mid + 1
  4. a: left ← mid b: right ← mid - 1
  5. a: left ← mid - 1 b: right ← mid + 1
答えと解説を見る

正解: a: left ← mid + 1 b: right ← mid - 1

中央値がtargetより小さいときは、mid以下を候補から外してleftをmid+1にします。中央値がtargetより大きいときは、rightをmid-1にします。

まちがえやすい点: mid自身は比較済みなので、次の範囲には含めない。

科目Bの形: プログラム(擬似言語)を読んで解答群から選ぶ(このページのために作った問題)

次の関数digitSumをdigitSum(4726)として呼び出したとき、戻り値として正しいものを解答群から選べ。

 1○整数型: digitSum(整数型: n)
 2  if (n < 10)
 3    return n
 4  else
 5    return n mod 10 + digitSum(n ÷ 10 の商)
 6  endif
  1. 9
  2. 12
  3. 15
  4. 19
  5. 26
答えと解説を見る

正解: 19

4726は末尾の6と472へ分かれ、同じ処理で2、7、4が順に加わります。6+2+7+4=19なので戻り値は19です。

まちがえやすい点: n ÷ 10 の商は末尾の1桁を除く操作として使われる。

基本情報の学習ページ

ほかの学習ページの一覧と、2択の用語カード(750語)は、基本情報技術者のページにあります。

基本情報技術者のページへ →

このページの内容は、IPA「基本情報技術者試験 シラバス Ver.9.2」(2026年1月公表)と試験要綱Ver.5.6の範囲にもとづきます(2026年10月確認)。IPAは2027年度春ごろから新しい試験制度に移る予定です。