【情報I プログラミング完全攻略】基礎から入試まで完全攻略|問題30問+解説|藤原進之介
```html
こんにちは、日本数学塾・数強塾の講師、藤原進之介です。
2025年度から共通テストに新たに導入された「情報I」。特にプログラミング分野は、多くの受験生が「何から手をつけていいかわからない」「問題を見ても何をすればいいかわからない」と悩んでいます。
しかし、安心してください。情報Iのプログラミング問題には明確な出題パターンがあり、体系的に学習すれば確実に得点源にできます。私はこれまで9冊の著書を執筆し、多くの受験生を合格に導いてきました。その経験をもとに、この記事では基礎から入試レベルまで30問以上の問題と完全解説をお届けします。
この記事を最後まで読めば、情報Iプログラミング分野で8割以上の得点を目指せる実力が身につきます。
この記事でわかること
- 情報Iプログラミングの基本概念と重要公式を完全理解できる
- 変数・配列・条件分岐・繰り返しなど基礎的な構文をマスターできる
- 基礎問題10問で基本的な処理の流れを確実に身につけられる
- 標準問題10問で入試頻出パターンを網羅できる
- 発展・入試レベル問題10問で実践力を鍛えられる
- よくある間違いとその対策を知り、失点を防げる
- 共通テスト・大学入試での出題傾向を把握できる
- 効率的な勉強法と最適な参考書がわかる
情報I プログラミング完全攻略 の基本概念と重要公式
1. 変数とデータ型
プログラミングにおける変数とは、データを格納する「箱」のようなものです。共通テストの擬似言語では、変数に値を代入する際に「←」記号を使用します。
x ← 5 // 変数xに5を代入 y ← "Hello" // 変数yに文字列"Hello"を代入 z ← True // 変数zに真偽値Trueを代入
主なデータ型:
- 整数型(int):-3, 0, 42 など
- 実数型(float):3.14, -2.5 など
- 文字列型(string):"Hello", "情報" など
- 真偽型(boolean):True, False
2. 配列(リスト)
配列は、複数のデータをまとめて管理するためのデータ構造です。共通テストでは添字(インデックス)の扱いが頻出します。
// 配列の宣言と初期化 A ← [10, 20, 30, 40, 50] // 配列へのアクセス(添字は0から始まる場合と1から始まる場合がある) A[0] → 10 // 0始まりの場合 A[1] → 10 // 1始まりの場合
重要ポイント:共通テストの問題文で「添字は0から始まる」か「添字は1から始まる」かを必ず確認してください。これを間違えると全問不正解になりかねません。
3. 算術演算子
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
| + | 加算 | 5 + 3 | 8 |
| - | 減算 | 5 - 3 | 2 |
| * | 乗算 | 5 * 3 | 15 |
| / | 除算 | 5 / 3 | 1.666... |
| // | 整数除算(商) | 5 // 3 | 1 |
| % | 剰余(余り) | 5 % 3 | 2 |
| ** | べき乗 | 5 ** 3 | 125 |
特に重要なのは整数除算(//)と剰余(%)です。これらは入試で頻出です。
【重要公式】整数の分解
任意の整数Nを別の整数Dで割ったとき:
N = D × (N // D) + (N % D)
例:17 = 5 × 3 + 2 → 17 // 5 = 3, 17 % 5 = 2
4. 比較演算子と論理演算子
比較演算子:
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
| == | 等しい | 5 == 5 | True |
| != | 等しくない | 5 != 3 | True |
| < | 小さい | 3 < 5 | True |
| > | 大きい | 5 > 3 | True |
| <= | 以下 | 5 <= 5 | True |
| >= | 以上 | 5 >= 3 | True |
論理演算子:
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
| and(かつ) | 両方Trueの時True | True and False | False |
| or(または) | どちらかTrueの時True | True or False | True |
| not(否定) | True/Falseを反転 | not True | False |
5. 条件分岐(if文)
// 基本形
もし(条件)ならば
処理1
そうでなければ
処理2
// 複数条件
もし(条件1)ならば
処理1
そうでなくもし(条件2)ならば
処理2
そうでなければ
処理3
6. 繰り返し(ループ)
for文(決まった回数の繰り返し):
// iを1から10まで1ずつ増やしながら繰り返す
iを1から10まで1ずつ増やしながら繰り返す
表示(i)
while文(条件が満たされる間繰り返す):
// 条件がTrueの間繰り返す
(条件)の間繰り返す
処理
7. 関数
関数の定義と呼び出し:
// 関数の定義
関数 関数名(引数1, 引数2)
処理
return 戻り値
// 関数の呼び出し
結果 ← 関数名(値1, 値2)
8. 重要なアルゴリズムパターン
①合計を求める:
sum ← 0
iを1からnまで1ずつ増やしながら繰り返す
sum ← sum + A[i]
②最大値を求める:
max ← A[1]
iを2からnまで1ずつ増やしながら繰り返す
もし A[i] > max ならば
max ← A[i]
③最小値を求める:
min ← A[1]
iを2からnまで1ずつ増やしながら繰り返す
もし A[i] < min ならば
min ← A[i]
④条件を満たす要素の個数を数える:
count ← 0
iを1からnまで1ずつ増やしながら繰り返す
もし (条件) ならば
count ← count + 1
⑤線形探索(逐次探索):
found ← False
iを1からnまで1ずつ増やしながら繰り返す
もし A[i] == target ならば
found ← True
break
基礎問題 10問(全問解説付き)
基礎問題1:変数の代入と計算
【問題】
次のプログラムを実行したとき、変数zの値を答えよ。
x ← 10 y ← 3 z ← x + y * 2
【考え方】
演算子の優先順位に注意します。数学と同様に、乗算(*)は加算(+)より先に計算されます。
【解法】
- x ← 10 で、xに10が代入される
- y ← 3 で、yに3が代入される
- z ← x + y * 2 を計算
- まず y * 2 = 3 * 2 = 6
- 次に x + 6 = 10 + 6 = 16
【答】z = 16
基礎問題2:整数除算と剰余
【問題】
次のプログラムを実行したとき、変数aとbの値をそれぞれ答えよ。
n ← 17 a ← n // 5 b ← n % 5
【考え方】
//は整数除算(商)、%は剰余(余り)を求める演算子です。17÷5を計算すると、商は3、余りは2です。
【解法】
- n ← 17 で、nに17が代入される
- a ← n // 5 = 17 // 5 = 3(商)
- b ← n % 5 = 17 % 5 = 2(余り)
検算:5 × 3 + 2 = 15 + 2 = 17 ✓
【答】a = 3, b = 2
基礎問題3:条件分岐の基本
【問題】
次のプログラムを実行したとき、表示される値を答えよ。
x ← 7
もし x > 10 ならば
表示("大")
そうでなくもし x > 5 ならば
表示("中")
そうでなければ
表示("小")
【考え方】
条件分岐では、上から順に条件をチェックし、最初に成り立つ条件の処理を実行します。
【解法】
- x ← 7 で、xに7が代入される
- 「x > 10」をチェック → 7 > 10 は False
- 「x > 5」をチェック → 7 > 5 は True → 「中」を表示
【答】"中"
基礎問題4:繰り返しの基本(for文)
【問題】
次のプログラムを実行したとき、変数sumの最終的な値を答えよ。
sum ← 0
iを1から5まで1ずつ増やしながら繰り返す
sum ← sum + i
【考え方】
1から5までの整数の合計を求めるプログラムです。トレース表を作成して確認しましょう。
【解法】
| i | sum(更新前) | sum + i | sum(更新後) |
|---|---|---|---|
| 1 | 0 | 0 + 1 | 1 |
| 2 | 1 | 1 + 2 | 3 |
| 3 | 3 | 3 + 3 | 6 |
| 4 | 6 | 6 + 4 | 10 |
| 5 | 10 | 10 + 5 | 15 |
数学公式でも確認:1+2+3+4+5 = 5×6÷2 = 15
【答】sum = 15
基礎問題5:配列の基本操作
【問題】
配列Aの添字は0から始まるものとする。次のプログラムを実行したとき、表示される値を答えよ。
A ← [5, 10, 15, 20, 25] x ← A[1] + A[3] 表示(x)
【考え方】
添字が0から始まる配列では、A[0]=5, A[1]=10, A[2]=15, A[3]=20, A[4]=25 となります。
【解法】
- A[1] = 10
- A[3] = 20
- x = 10 + 20 = 30
【答】30
基礎問題6:配列の要素の合計
【問題】
配列Aの添字は0から始まるものとする。次のプログラムを実行したとき、変数sumの最終的な値を答えよ。
A ← [3, 7, 2, 8, 5]
sum ← 0
iを0から4まで1ずつ増やしながら繰り返す
sum ← sum + A[i]
【考え方】
配列のすべての要素を順番に加算していくプログラムです。
【解法】
| i | A[i] | sum(更新後) |
|---|---|---|
| 0 | 3 | 0 + 3 = 3 |
| 1 | 7 | 3 + 7 = 10 |
| 2 | 2 | 10 + 2 = 12 |
| 3 | 8 | 12 + 8 = 20 |
| 4 | 5 | 20 + 5 = 25 |
【答】sum = 25
基礎問題7:条件を満たす要素のカウント
【問題】
配列Aの添字は0から始まるものとする。次のプログラムを実行したとき、変数countの最終的な値を答えよ。
A ← [12, 5, 8, 15, 3, 10, 7]
count ← 0
iを0から6まで1ずつ増やしながら繰り返す
もし A[i] >= 10 ならば
count ← count + 1
【考え方】
配列の各要素を調べ、10以上の要素の個数を数えるプログラムです。
【解法】
配列Aの各要素をチェック:
- A[0] = 12 → 12 >= 10 → True → count = 1
- A[1] = 5 → 5 >= 10 → False
- A[2] = 8 → 8 >= 10 → False
- A[3] = 15 → 15 >= 10 → True → count = 2
- A[4] = 3 → 3 >= 10 → False
- A[5] = 10 → 10 >= 10 → True → count = 3
- A[6] = 7 → 7 >= 10 → False
【答】count = 3
基礎問題8:最大値の探索
【問題】
配列Aの添字は0から始まるものとする。次のプログラムを実行したとき、変数maxの最終的な値を答えよ。
A ← [4, 9, 2, 7, 5]
max ← A[0]
iを1から4まで1ずつ増やしながら繰り返す
もし A[i] > max ならば
max ← A[i]
【考え方】
最大値を求める典型的なアルゴリズムです。最初の要素を暫定最大値とし、順番に比較していきます。
【解法】
| i | A[i] | A[i] > max ? | max(更新後) |
|---|---|---|---|
| 初期 | - | - | 4 |
| 1 | 9 | 9 > 4 → True | 9 |
| 2 | 2 | 2 > 9 → False | 9 |
| 3 | 7 | 7 > 9 → False | 9 |
| 4 | 5 | 5 > 9 → False | 9 |
【答】max = 9
基礎問題9:while文の基本
【問題】
次のプログラムを実行したとき、変数countの最終的な値を答えよ。
n ← 100
count ← 0
(n > 0)の間繰り返す
n ← n // 2
count ← count + 1
【考え方】
nを2で割り続け、0になるまでの回数を数えるプログラムです。これは「100を2進数で表したときの桁数」を求める処理でもあります。
【解法】
| 繰り返し | n(更新前) | n // 2 | count(更新後) | n > 0 ? |
|---|---|---|---|---|
| 1回目 | 100 | 50 | 1 | True |
| 2回目 | 50 | 25 | 2 | True |
| 3回目 | 25 | 12 | 3 | True |
| 4回目 | 12 | 6 | 4 | True |
| 5回目 | 6 | 3 | 5 | True |
| 6回目 | 3 | 1 | 6 | True |
| 7回目 | 1 | 0 | 7 | False(終了) |
【答】count = 7
基礎問題10:関数の基本
【問題】
次のプログラムを実行したとき、表示される値を答えよ。
関数 twice(x)
return x * 2
関数 add(a, b)
return a + b
result ← add(twice(3), 5)
表示(result)
【考え方】
関数の入れ子(ネスト)呼び出しです。内側の関数から先に評価されます。
【解法】
- twice(3) を評価 → 3 * 2 = 6
- add(6, 5) を評価 → 6 + 5 = 11
- result ← 11
- 11が表示される
【答】11
標準問題 10問(全問解説付き)
標準問題1:二重ループによる九九表
【問題】
次のプログラムは、二次元配列Tableに九九の計算結果を格納するものである。配列の添字は1から始まるものとする。プログラム実行後、Table[3][7]の値を答えよ。
iを1から9まで1続きを出力します。
```html
iを1から9まで1ずつ増やしながら繰り返す
jを1から9まで1ずつ増やしながら繰り返す
Table[i][j] ← i * j
【考え方】
二重ループによって、Table[i][j]にはi×jの値が格納されます。九九の表をイメージするとわかりやすいです。
【解法】
Table[3][7]の値は、i=3, j=7のときに代入される値なので:
Table[3][7] = 3 × 7 = 21
【答】21
標準問題2:偶数の合計
【問題】
配列Aの添字は0から始まるものとする。次のプログラムを実行したとき、変数sumの最終的な値を答えよ。
A ← [3, 8, 5, 12, 7, 4, 9, 6]
sum ← 0
iを0から7まで1ずつ増やしながら繰り返す
もし A[i] % 2 == 0 ならば
sum ← sum + A[i]
【考え方】
A[i] % 2 == 0 は「A[i]を2で割った余りが0」、つまり「A[i]が偶数」を意味します。偶数のみを合計するプログラムです。
【解法】
配列Aの各要素をチェック:
- A[0] = 3 → 3 % 2 = 1 ≠ 0(奇数)
- A[1] = 8 → 8 % 2 = 0(偶数)→ sum = 0 + 8 = 8
- A[2] = 5 → 5 % 2 = 1 ≠ 0(奇数)
- A[3] = 12 → 12 % 2 = 0(偶数)→ sum = 8 + 12 = 20
- A[4] = 7 → 7 % 2 = 1 ≠ 0(奇数)
- A[5] = 4 → 4 % 2 = 0(偶数)→ sum = 20 + 4 = 24
- A[6] = 9 → 9 % 2 = 1 ≠ 0(奇数)
- A[7] = 6 → 6 % 2 = 0(偶数)→ sum = 24 + 6 = 30
【答】sum = 30
標準問題3:フィボナッチ数列
【問題】
配列Fの添字は1から始まるものとする。次のプログラムを実行したとき、F[8]の値を答えよ。
F[1] ← 1
F[2] ← 1
iを3から10まで1ずつ増やしながら繰り返す
F[i] ← F[i-1] + F[i-2]
【考え方】
フィボナッチ数列は、直前の2つの項の和が次の項になる数列です。1, 1, 2, 3, 5, 8, 13, 21, ... と続きます。
【解法】
| i | F[i-1] | F[i-2] | F[i] = F[i-1] + F[i-2] |
|---|---|---|---|
| 1 | - | - | 1(初期値) |
| 2 | - | - | 1(初期値) |
| 3 | 1 | 1 | 1 + 1 = 2 |
| 4 | 2 | 1 | 2 + 1 = 3 |
| 5 | 3 | 2 | 3 + 2 = 5 |
| 6 | 5 | 3 | 5 + 3 = 8 |
| 7 | 8 | 5 | 8 + 5 = 13 |
| 8 | 13 | 8 | 13 + 8 = 21 |
【答】F[8] = 21
標準問題4:素数判定
【問題】
次の関数isPrime(n)は、nが素数かどうかを判定する関数である。空欄[ア]と[イ]に入る適切な式を答えよ。
関数 isPrime(n)
もし n < 2 ならば
return False
iを2から[ア]まで1ずつ増やしながら繰り返す
もし [イ] ならば
return False
return True
【考え方】
素数とは、1と自分自身以外に約数を持たない2以上の整数です。素数判定では、2からその数の平方根までの整数で割り切れるかをチェックすれば十分です。
【解法】
[ア]について:nが合成数(素数でない数)なら、n = a × b と表せ、aとbの小さい方は必ず√n以下です。よって√nまで調べれば十分です。
[イ]について:iでnが割り切れれば(余りが0なら)、nは素数ではありません。
【答】
[ア] = n の平方根(または sqrt(n)、あるいは n // 2 でも可)
[イ] = n % i == 0
標準問題5:線形探索と位置の特定
【問題】
配列Aの添字は0から始まるものとする。次のプログラムは、配列Aから値targetを探し、その位置を返す関数である。見つからない場合は-1を返す。空欄[ア]と[イ]に入る適切な式を答えよ。
関数 linearSearch(A, n, target)
iを0から[ア]まで1ずつ増やしながら繰り返す
もし A[i] == target ならば
return [イ]
return -1
ただし、nは配列Aの要素数である。
【考え方】
線形探索は、配列の先頭から順番に目的の値を探すアルゴリズムです。
【解法】
[ア]について:添字が0から始まる配列で要素数がnの場合、最後の要素の添字はn-1です。
[イ]について:見つかった位置(インデックス)iを返します。
【答】
[ア] = n - 1
[イ] = i
標準問題6:バブルソート
【問題】
配列Aの添字は0から始まるものとする。次のプログラムは、配列Aを昇順(小さい順)に並べ替えるバブルソートである。配列A = [5, 3, 8, 1, 4]に対して、最初のパス(i=0のとき、jのループが1回終了した時点)での配列Aの状態を答えよ。
iを0からn-2まで1ずつ増やしながら繰り返す
jを0からn-2-iまで1ずつ増やしながら繰り返す
もし A[j] > A[j+1] ならば
temp ← A[j]
A[j] ← A[j+1]
A[j+1] ← temp
ただし、n=5(配列の要素数)である。
【考え方】
バブルソートでは、隣り合う要素を比較し、順序が逆なら交換します。1パス終了すると、最大の要素が末尾に移動します。
【解法】
初期状態:A = [5, 3, 8, 1, 4]
i=0のとき、jは0から3まで変化(n-2-i = 5-2-0 = 3)
| j | 比較 | 交換? | 配列の状態 |
|---|---|---|---|
| 0 | A[0]=5 > A[1]=3 | Yes | [3, 5, 8, 1, 4] |
| 1 | A[1]=5 > A[2]=8 | No | [3, 5, 8, 1, 4] |
| 2 | A[2]=8 > A[3]=1 | Yes | [3, 5, 1, 8, 4] |
| 3 | A[3]=8 > A[4]=4 | Yes | [3, 5, 1, 4, 8] |
【答】A = [3, 5, 1, 4, 8]
標準問題7:二分探索
【問題】
配列Aの添字は0から始まるものとする。昇順にソート済みの配列A = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]に対して、二分探索で値23を探す。比較が行われる順に、比較される配列の要素を全て答えよ。
関数 binarySearch(A, n, target)
left ← 0
right ← n - 1
(left <= right)の間繰り返す
mid ← (left + right) // 2
もし A[mid] == target ならば
return mid
そうでなくもし A[mid] < target ならば
left ← mid + 1
そうでなければ
right ← mid - 1
return -1
【考え方】
二分探索は、ソート済み配列の中央の要素と目的の値を比較し、探索範囲を半分に絞り込むアルゴリズムです。
【解法】
A = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91](添字0〜9)、target = 23、n = 10
| 回 | left | right | mid | A[mid] | 比較結果 | 次の処理 |
|---|---|---|---|---|---|---|
| 1 | 0 | 9 | 4 | 16 | 16 < 23 | left = 5 |
| 2 | 5 | 9 | 7 | 56 | 56 > 23 | right = 6 |
| 3 | 5 | 6 | 5 | 23 | 23 == 23 | 発見! |
【答】16, 56, 23(この順で比較される)
標準問題8:文字列の操作
【問題】
次のプログラムは、文字列sを逆順にした文字列を返す関数である。s = "ABCDE"のとき、関数の戻り値を答えよ。また、空欄[ア]に入る適切な式を答えよ。
関数 reverse(s)
result ← ""
n ← sの長さ
iを[ア]から0まで1ずつ減らしながら繰り返す
result ← result + s[i]
return result
ただし、文字列の添字は0から始まるものとする。
【考え方】
文字列を逆順にするには、末尾から先頭に向かって1文字ずつ取り出し、結果の文字列に連結していきます。
【解法】
s = "ABCDE"のとき、n = 5
添字は0から始まるので、最後の文字の添字は n-1 = 4
よって[ア] = n - 1
| i | s[i] | result |
|---|---|---|
| 4 | "E" | "" + "E" = "E" |
| 3 | "D" | "E" + "D" = "ED" |
| 2 | "C" | "ED" + "C" = "EDC" |
| 1 | "B" | "EDC" + "B" = "EDCB" |
| 0 | "A" | "EDCB" + "A" = "EDCBA" |
【答】戻り値 = "EDCBA"、[ア] = n - 1
標準問題9:階乗の計算
【問題】
次のプログラムは、nの階乗(n!)を計算する関数である。factorial(5)を呼び出したとき、returnが実行される回数と、最終的な戻り値を答えよ。
関数 factorial(n)
もし n <= 1 ならば
return 1
そうでなければ
return n * factorial(n - 1)
【考え方】
これは再帰関数です。n! = n × (n-1)! という関係を利用しています。
【解法】
関数呼び出しの流れ:
- factorial(5) → 5 * factorial(4)
- factorial(4) → 4 * factorial(3)
- factorial(3) → 3 * factorial(2)
- factorial(2) → 2 * factorial(1)
- factorial(1) → return 1(基底条件)
戻りの計算:
- factorial(1) = 1
- factorial(2) = 2 × 1 = 2
- factorial(3) = 3 × 2 = 6
- factorial(4) = 4 × 6 = 24
- factorial(5) = 5 × 24 = 120
【答】returnが実行される回数 = 5回、戻り値 = 120
標準問題10:2次元配列と条件集計
【問題】
次の2次元配列Scoreは、5人の生徒の3科目(国語・数学・英語)の点数を表している。添字は0から始まるものとする。次のプログラムを実行したとき、countの値を答えよ。
Score ← [[80, 75, 90], // 生徒0
[65, 85, 70], // 生徒1
[90, 92, 88], // 生徒2
[78, 60, 82], // 生徒3
[85, 88, 95]] // 生徒4
count ← 0
iを0から4まで1ずつ増やしながら繰り返す
sum ← 0
jを0から2まで1ずつ増やしながら繰り返す
sum ← sum + Score[i][j]
もし sum >= 250 ならば
count ← count + 1
【考え方】
各生徒の3科目合計が250点以上かどうかをチェックし、該当する生徒の人数を数えるプログラムです。
【解法】
| 生徒 | 国語 | 数学 | 英語 | 合計 | 250以上? |
|---|---|---|---|---|---|
| 0 | 80 | 75 | 90 | 245 | No |
| 1 | 65 | 85 | 70 | 220 | No |
| 2 | 90 | 92 | 88 | 270 | Yes → count = 1 |
| 3 | 78 | 60 | 82 | 220 | No |
| 4 | 85 | 88 | 95 | 268 | Yes → count = 2 |
【答】count = 2
発展・入試レベル問題 10問(全問解説付き)
発展問題1:ユークリッドの互除法
【問題】
次のプログラムは、2つの正の整数aとbの最大公約数を求める関数(ユークリッドの互除法)である。gcd(48, 18)を呼び出したとき、while文のループが実行される回数と、最終的な戻り値を答えよ。
関数 gcd(a, b)
(b != 0)の間繰り返す
r ← a % b
a ← b
b ← r
return a
【考え方】
ユークリッドの互除法は、「gcd(a, b) = gcd(b, a % b)」という性質を利用して最大公約数を求めるアルゴリズムです。
【解法】
gcd(48, 18)の実行過程:
| 回 | a | b | r = a % b | b != 0 ? |
|---|---|---|---|---|
| 初期 | 48 | 18 | - | True |
| 1回目 | 18 | 12 | 48 % 18 = 12 | True |
| 2回目 | 12 | 6 | 18 % 12 = 6 | True |
| 3回目 | 6 | 0 | 12 % 6 = 0 | False(終了) |
検算:48 = 6 × 8、18 = 6 × 3、gcd(48, 18) = 6 ✓
【答】ループ実行回数 = 3回、戻り値 = 6
発展問題2:選択ソートのアルゴリズム穴埋め
【問題】
次のプログラムは、配列Aを昇順に並べ替える選択ソートである。空欄[ア]〜[ウ]に入る適切な式を答えよ。配列の添字は0から始まるものとする。
関数 selectionSort(A, n)
iを0から[ア]まで1ずつ増やしながら繰り返す
min_idx ← i
jを[イ]からn-1まで1ずつ増やしながら繰り返す
もし A[j] < A[min_idx] ならば
min_idx ← j
// A[i]とA[min_idx]を交換
temp ← A[i]
A[i] ← A[min_idx]
A[[ウ]] ← temp
【考え方】
選択ソートは、未ソート部分から最小値を見つけ、先頭と交換する操作を繰り返すアルゴリズムです。
【解法】
[ア]について:外側のループはi=0からi=n-2まで。最後の1要素は自動的に正しい位置に来るため。
[イ]について:最小値の探索はi+1から始める。i番目より前は既にソート済みのため。
[ウ]について:A[i]とA[min_idx]を交換するので、tempに退避したA[i]をA[min_idx]に代入。
【答】
[ア] = n - 2
[イ] = i + 1
[ウ] = min_idx
発展問題3:10進数から2進数への変換
【問題】
次のプログラムは、10進数nを2進数の文字列に変換する関数である。toBinary(13)を呼び出したとき、戻り値を答えよ。
関数 toBinary(n)
もし n == 0 ならば
return "0"
result ← ""
(n > 0)の間繰り返す
bit ← n % 2
result ← 文字列(bit) + result
n ← n // 2
return result
【考え方】
10進数を2進数に変換するには、2で割った余りを逆順に並べます。
【解法】
n = 13 のとき:
| 回 | n | n % 2 | result | n // 2 |
|---|---|---|---|---|
| 1 | 13 | 1 | "1" | 6 |
| 2 | 6 | 0 | "01" | 3 |
| 3 | 3 | 1 | "101" | 1 |
| 4 | 1 | 1 | "1101" | 0 |
n = 0 になったのでループ終了
検算:1101(2) = 8 + 4 + 0 + 1 = 13 ✓
【答】"1101"
発展問題4:エラトステネスの篩
【問題】
次のプログラムは、2以上n以下の素数を全て求めるエラトステネスの篩である。sieve(20)を実行した後、配列isPrimeでTrueになっている添字を全て答えよ。配列の添字は0から始まるものとする。
関数 sieve(n)
isPrime ← 大きさn+1の配列で全てTrueで初期化
isPrime[0] ← False
isPrime[1] ← False
iを2からnの平方根まで1ずつ増やしながら続きを出力します。
```html
iを2からnの平方根まで1ずつ増やしながら繰り返す
もし isPrime[i] == True ならば
jをi*iからnまでiずつ増やしながら繰り返す
isPrime[j] ← False
return isPrime
【考え方】
エラトステネスの篩は、2から順に倍数を消していくことで素数を見つけるアルゴリズムです。
【解法】
n = 20、√20 ≈ 4.47 なので i は 2, 3, 4 まで
初期状態:isPrime[2]〜isPrime[20]が全てTrue
i = 2 のとき:
isPrime[2] = True なので、j = 4, 6, 8, 10, 12, 14, 16, 18, 20 をFalseに
i = 3 のとき:
isPrime[3] = True なので、j = 9, 12, 15, 18 をFalseに(既にFalseのものも含む)
i = 4 のとき:
isPrime[4] = False なので何もしない
最終的にisPrime[i] = Trueの添字:
2, 3, 5, 7, 11, 13, 17, 19
【答】2, 3, 5, 7, 11, 13, 17, 19
発展問題5:クイックソートの分割操作
【問題】
次のプログラムは、クイックソートにおける分割(パーティション)操作である。配列A = [8, 3, 7, 1, 5, 9, 2]に対してpartition(A, 0, 6)を呼び出したとき、戻り値と、関数終了時の配列Aの状態を答えよ。配列の添字は0から始まるものとする。
関数 partition(A, low, high)
pivot ← A[high]
i ← low - 1
jをlowからhigh-1まで1ずつ増やしながら繰り返す
もし A[j] <= pivot ならば
i ← i + 1
// A[i]とA[j]を交換
temp ← A[i]
A[i] ← A[j]
A[j] ← temp
// A[i+1]とA[high]を交換
temp ← A[i+1]
A[i+1] ← A[high]
A[high] ← temp
return i + 1
【考え方】
パーティション操作は、ピボット(基準値)を選び、それより小さい要素を左に、大きい要素を右に分ける処理です。
【解法】
A = [8, 3, 7, 1, 5, 9, 2]、low = 0、high = 6
pivot = A[6] = 2、i = -1
| j | A[j] | A[j] <= 2 ? | 処理 | 配列の状態 | i |
|---|---|---|---|---|---|
| 0 | 8 | No | なし | [8, 3, 7, 1, 5, 9, 2] | -1 |
| 1 | 3 | No | なし | [8, 3, 7, 1, 5, 9, 2] | -1 |
| 2 | 7 | No | なし | [8, 3, 7, 1, 5, 9, 2] | -1 |
| 3 | 1 | Yes | i=0, A[0]とA[3]を交換 | [1, 3, 7, 8, 5, 9, 2] | 0 |
| 4 | 5 | No | なし | [1, 3, 7, 8, 5, 9, 2] | 0 |
| 5 | 9 | No | なし | [1, 3, 7, 8, 5, 9, 2] | 0 |
ループ終了後、A[i+1] = A[1]とA[high] = A[6]を交換:
[1, 2, 7, 8, 5, 9, 3]
【答】戻り値 = 1、配列A = [1, 2, 7, 8, 5, 9, 3]
発展問題6:再帰による累乗計算(繰り返し二乗法)
【問題】
次のプログラムは、a^n(aのn乗)を効率的に計算する関数である。power(2, 10)を呼び出したとき、乗算(*)が実行される回数と、最終的な戻り値を答えよ。
関数 power(a, n)
もし n == 0 ならば
return 1
そうでなくもし n % 2 == 0 ならば
half ← power(a, n // 2)
return half * half
そうでなければ
return a * power(a, n - 1)
【考え方】
繰り返し二乗法は、a^n を O(log n) の計算量で求めるアルゴリズムです。nが偶数なら a^n = (a^(n/2))^2、奇数なら a^n = a × a^(n-1) を利用します。
【解法】
power(2, 10)の呼び出しの流れ:
- power(2, 10):n=10(偶数)→ half = power(2, 5)、return half * half
- power(2, 5):n=5(奇数)→ return 2 * power(2, 4)
- power(2, 4):n=4(偶数)→ half = power(2, 2)、return half * half
- power(2, 2):n=2(偶数)→ half = power(2, 1)、return half * half
- power(2, 1):n=1(奇数)→ return 2 * power(2, 0)
- power(2, 0):n=0 → return 1
戻りの計算:
- power(2, 0) = 1
- power(2, 1) = 2 * 1 = 2 【乗算1回目】
- power(2, 2) = 2 * 2 = 4 【乗算2回目】
- power(2, 4) = 4 * 4 = 16 【乗算3回目】
- power(2, 5) = 2 * 16 = 32 【乗算4回目】
- power(2, 10) = 32 * 32 = 1024 【乗算5回目】
【答】乗算の回数 = 5回、戻り値 = 1024
発展問題7:マージソートのマージ操作
【問題】
次のプログラムは、2つのソート済み配列をマージ(併合)して1つのソート済み配列を作る関数である。merge([2, 5, 8], [1, 4, 6, 9])を呼び出したとき、戻り値を答えよ。
関数 merge(A, B)
result ← []
i ← 0
j ← 0
(i < Aの要素数 かつ j < Bの要素数)の間繰り返す
もし A[i] <= B[j] ならば
resultの末尾にA[i]を追加
i ← i + 1
そうでなければ
resultの末尾にB[j]を追加
j ← j + 1
(i < Aの要素数)の間繰り返す
resultの末尾にA[i]を追加
i ← i + 1
(j < Bの要素数)の間繰り返す
resultの末尾にB[j]を追加
j ← j + 1
return result
【考え方】
2つのソート済み配列の先頭要素を比較し、小さい方を結果配列に追加していきます。
【解法】
A = [2, 5, 8]、B = [1, 4, 6, 9]
| ステップ | i | j | 比較 | 追加 | result |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 2 > 1 | B[0]=1 | [1] |
| 2 | 0 | 1 | 2 <= 4 | A[0]=2 | [1, 2] |
| 3 | 1 | 1 | 5 > 4 | B[1]=4 | [1, 2, 4] |
| 4 | 1 | 2 | 5 <= 6 | A[1]=5 | [1, 2, 4, 5] |
| 5 | 2 | 2 | 8 > 6 | B[2]=6 | [1, 2, 4, 5, 6] |
| 6 | 2 | 3 | 8 <= 9 | A[2]=8 | [1, 2, 4, 5, 6, 8] |
i = 3 となりAの要素を使い切ったので、Bの残り要素を追加:
B[3] = 9 を追加 → [1, 2, 4, 5, 6, 8, 9]
【答】[1, 2, 4, 5, 6, 8, 9]
発展問題8:動的計画法(フィボナッチ数列のメモ化)
【問題】
次のプログラムは、メモ化を用いてフィボナッチ数列のn番目の値を求める関数である。fib(6)を呼び出したとき、fib関数が呼び出される総回数(最初の呼び出しを含む)と、最終的な戻り値を答えよ。memo配列は全て-1で初期化されているものとする。
memo ← 大きさ100の配列で全て-1で初期化
関数 fib(n)
もし n <= 1 ならば
return n
もし memo[n] != -1 ならば
return memo[n]
memo[n] ← fib(n-1) + fib(n-2)
return memo[n]
【考え方】
メモ化により、一度計算した値は再利用されるため、通常の再帰よりも関数呼び出し回数が大幅に減ります。
【解法】
fib(6)の呼び出しの流れ:
- fib(6) → memo[6]は-1なので、fib(5) + fib(4)を計算
- fib(5) → memo[5]は-1なので、fib(4) + fib(3)を計算
- fib(4) → memo[4]は-1なので、fib(3) + fib(2)を計算
- fib(3) → memo[3]は-1なので、fib(2) + fib(1)を計算
- fib(2) → memo[2]は-1なので、fib(1) + fib(0)を計算
- fib(1) → return 1
- fib(0) → return 0
- fib(2)に戻る → memo[2] = 1、return 1
- fib(1) → return 1
- fib(3)に戻る → memo[3] = 2、return 2
- fib(2) → memo[2] = 1(既に計算済み)、return 1
- fib(4)に戻る → memo[4] = 3、return 3
- fib(3) → memo[3] = 2(既に計算済み)、return 2
- fib(5)に戻る → memo[5] = 5、return 5
- fib(4) → memo[4] = 3(既に計算済み)、return 3
- fib(6)に戻る → memo[6] = 8、return 8
関数呼び出し回数をカウント:fib(6), fib(5), fib(4), fib(3), fib(2), fib(1), fib(0), fib(1), fib(2), fib(3), fib(4) の11回
【答】呼び出し回数 = 11回、戻り値 = 8
発展問題9:スタックを用いた括弧の対応チェック
【問題】
次のプログラムは、文字列中の括弧(()、[]、{})の対応が正しいかをチェックする関数である。checkBrackets("([{}])")とcheckBrackets("([)]")を呼び出したとき、それぞれの戻り値を答えよ。
関数 checkBrackets(s)
stack ← 空のスタック
iを0からsの長さ-1まで1ずつ増やしながら繰り返す
c ← s[i]
もし c == "(" または c == "[" または c == "{" ならば
stackにcをプッシュ
そうでなければ
もし stackが空 ならば
return False
top ← stackからポップ
もし (c == ")" かつ top != "(") または
(c == "]" かつ top != "[") または
(c == "}" かつ top != "{") ならば
return False
もし stackが空 ならば
return True
そうでなければ
return False
【考え方】
開き括弧をスタックに積み、閉じ括弧が来たらスタックのトップと対応を確認します。
【解法】
checkBrackets("([{}])")の場合:
| i | c | 処理 | stack |
|---|---|---|---|
| 0 | ( | プッシュ | ["("] |
| 1 | [ | プッシュ | ["(", "["] |
| 2 | { | プッシュ | ["(", "[", "{"] |
| 3 | } | ポップして"{"と比較 → OK | ["(", "["] |
| 4 | ] | ポップして"["と比較 → OK | ["("] |
| 5 | ) | ポップして"("と比較 → OK | [] |
stackが空 → return True
checkBrackets("([)]")の場合:
| i | c | 処理 | stack |
|---|---|---|---|
| 0 | ( | プッシュ | ["("] |
| 1 | [ | プッシュ | ["(", "["] |
| 2 | ) | ポップして"["と比較 → NG("["と")"は不一致) | - |
return False
【答】checkBrackets("([{}])") = True、checkBrackets("([)]") = False
発展問題10:ダイクストラ法の基本(最短経路問題)
【問題】
下図のグラフにおいて、頂点Aから各頂点への最短距離を求めるダイクストラ法を適用する。頂点が確定する順番と、頂点Aから頂点Eへの最短距離を答えよ。
2 3
A ───── B ───── D
│ │ │
│4 │1 │2
│ │ │
C ───── E ───── F
5 4
辺の重み:A-B: 2, A-C: 4, B-D: 3, B-E: 1, C-E: 5, D-F: 2, E-F: 4
【考え方】
ダイクストラ法は、始点から最も近い頂点を順に確定していくアルゴリズムです。
【解法】
初期状態:dist[A]=0, dist[B]=∞, dist[C]=∞, dist[D]=∞, dist[E]=∞, dist[F]=∞
| ステップ | 確定頂点 | dist[A] | dist[B] | dist[C] | dist[D] | dist[E] | dist[F] |
|---|---|---|---|---|---|---|---|
| 1 | A | 0 | 2 | 4 | ∞ | ∞ | ∞ |
| 2 | B | 0 | 2 | 4 | 5 | 3 | ∞ |
| 3 | E | 0 | 2 | 4 | 5 | 3 | 7 |
| 4 | C | 0 | 2 | 4 | 5 | 3 | 7 |
| 5 | D | 0 | 2 | 4 | 5 | 3 | 7 |
| 6 | F | 0 | 2 | 4 | 5 | 3 | 7 |
確定の順番:A → B → E → C → D → F
Aから各頂点への最短距離:B=2, C=4, D=5, E=3, F=7
【答】確定順:A, B, E, C, D, F 頂点Aから頂点Eへの最短距離 = 3
よくある間違いと完全対策
間違い1:配列の添字のずれ
【よくある間違い】
問題で「添字は1から始まる」と書いてあるのに、0から始まると勘違いしてA[0]にアクセスしてしまう。
【対策】
- 問題文の「添字は○から始まる」を必ず最初にチェック
- 問題用紙にマーカーで印をつけておく
- 配列の最初と最後の添字を問題の横にメモしておく
【例】
n個の要素を持つ配列で:
- 0始まり → A[0], A[1], ..., A[n-1]
- 1始まり → A[1], A[2], ..., A[n]
間違い2:ループの範囲ミス
【よくある間違い】
「iを1からnまで」と「iを1からn-1まで」を混同する。特に、「まで」が「以下」なのか「未満」なのかを勘違いする。
【対策】
- 共通テストの擬似言語では「iを1からnまで」は「1 ≤ i ≤ n」(nを含む)
- Pythonの range(1, n) は「1 ≤ i < n」(nを含まない)
- トレース表を作成して、実際にどの値まで処理されるか確認する
間違い3:条件分岐の評価順序
【よくある間違い】
複数の条件がある場合に、全ての条件が評価されると勘違いする。実際は、最初にTrueになった条件の処理のみが実行される。
【対策】
もし x > 10 ならば
処理A
そうでなくもし x > 5 ならば
処理B ← x = 15 のとき、ここは実行されない
そうでなければ
処理C
x = 15 の場合、「x > 10」がTrueなので処理Aのみ実行され、「x > 5」は評価すらされない。
間違い4:演算子の優先順位
【よくある間違い】
「a + b * c」を「(a + b) * c」と計算してしまう。
【対策】
演算子の優先順位(高い順):
- ** (べき乗)
- *, /, //, % (乗除・剰余)
- +, - (加減)
- ==, !=, , = (比較)
- not (論理否定)
- and (論理積)
- or (論理和)
迷ったら括弧で明示的に書くクセをつける。
間違い5:整数除算と通常の除算の混同
【よくある間違い】
「7 / 2」と「7 // 2」の結果を同じと思ってしまう。
【対策】
- 7 / 2 = 3.5(通常の除算、小数になる)
- 7 // 2 = 3(整数除算、小数点以下切り捨て)
- 7 % 2 = 1(剰余、余り)
検算:7 = 2 × 3 + 1 = 2 × (7 // 2) + (7 % 2)
間違い6:変数の初期化忘れ
【よくある間違い】
合計を求める際にsumを0で初期化し忘れる。カウントを求める際にcountを0で初期化し忘れる。
続きを出力します。
```html
【対策】
- 合計を求める場合:sum ← 0 で初期化
- カウントを求める場合:count ← 0 で初期化
- 最大値を求める場合:max ← 配列の最初の要素、または非常に小さい値
- 最小値を求める場合:min ← 配列の最初の要素、または非常に大きい値
- 文字列を連結する場合:result ← "" で初期化
プログラムを読むときは、必ず変数の初期値をチェックする習慣をつけましょう。
間違い7:論理演算子の混同
【よくある間違い】
「and」と「or」の動作を混同する。特に、「AかつB」「AまたはB」の日本語との対応を間違える。
【対策】
| A | B | A and B | A or B |
|---|---|---|---|
| True | True | True | True |
| True | False | False | True |
| False | True | False | True |
| False | False | False | False |
覚え方:
- and(かつ):両方Trueのときだけ True
- or(または):どちらか一方でもTrueなら True
間違い8:再帰関数の理解不足
【よくある間違い】
再帰関数の呼び出しの流れと戻りの流れを正しく追えない。
【対策】
- まず基底条件(終了条件)を確認する
- 再帰呼び出しの引数がどう変化するかを確認する
- コールスタックを図で描いて、呼び出しと戻りを可視化する
- 小さい値で実際にトレースしてみる
例:factorial(3)のトレース
factorial(3) 呼び出し
└─ factorial(2) 呼び出し
└─ factorial(1) 呼び出し
└─ return 1
└─ return 2 * 1 = 2
└─ return 3 * 2 = 6
間違い9:ループ変数のスコープ
【よくある間違い】
二重ループで内側と外側の変数を取り違える。
【対策】
- 外側ループ変数:i(行を表すことが多い)
- 内側ループ変数:j(列を表すことが多い)
- 2次元配列:A[i][j] で A[行][列]
どの変数がどの範囲で使われているか、インデントを確認しながら追いましょう。
間違い10:境界条件の見落とし
【よくある間違い】
配列の最初や最後の要素、ループの最初や最後の回での処理を見落とす。
【対策】
- 必ず最初の1回目と最後の1回目を個別にチェック
- 配列の要素数が0や1の場合にどうなるか考える
- トレース表の最初と最後の行を特に注意して確認
共通テスト・大学入試での出題傾向
2025年度共通テスト「情報I」の分析
2025年度から共通テストに「情報I」が新設され、全受験生必須の科目となりました。配点は100点で、国公立大学では合否を左右する重要科目です。
出題分野と配点比率
| 大問 | 分野 | 配点目安 | 特徴 |
|---|---|---|---|
| 第1問 | 情報社会の問題解決 | 約20点 | 情報モラル、著作権、個人情報など |
| 第2問 | コミュニケーションと情報デザイン | 約20点 | Webデザイン、ユーザビリティなど |
| 第3問 | コンピュータとプログラミング | 約30点 | プログラミング問題が中心 |
| 第4問 | 情報通信ネットワークとデータ活用 | 約30点 | 統計、データ分析、ネットワーク |
プログラミング分野の特徴
第3問の「コンピュータとプログラミング」は、情報Iの中で最も差がつきやすい分野です。以下の傾向があります:
- 擬似言語での出題:特定のプログラミング言語ではなく、共通テスト独自の擬似言語(DNCLベース)で出題
- トレース問題が頻出:プログラムの実行過程を追い、変数の値や出力を答える
- 穴埋め問題:プログラムの空欄に入る適切なコードを選ぶ
- アルゴリズムの理解:ソート、探索、数値計算などの基本アルゴリズム
- 配列操作:1次元・2次元配列の操作が必須
2024年試作問題・2025年本試験の傾向
- 身近な題材を用いた問題設定(ゲーム、買い物、成績処理など)
- 段階的な難易度:基礎→応用の流れで構成
- 複数の処理の組み合わせ:条件分岐+繰り返しなど
- データ構造の理解:配列、2次元配列、辞書的構造
- 計算量の概念:効率的なアルゴリズムの選択
頻出テーマベスト10
| 順位 | テーマ | 出題頻度 | 難易度 |
|---|---|---|---|
| 1 | 配列の操作(合計・平均・最大最小) | ★★★★★ | 基礎〜標準 |
| 2 | 条件分岐と繰り返しの組み合わせ | ★★★★★ | 基礎〜標準 |
| 3 | 線形探索 | ★★★★☆ | 標準 |
| 4 | ソートアルゴリズム(バブル・選択) | ★★★★☆ | 標準〜発展 |
| 5 | 2次元配列の操作 | ★★★★☆ | 標準 |
| 6 | 文字列処理 | ★★★☆☆ | 標準 |
| 7 | 二分探索 | ★★★☆☆ | 標準〜発展 |
| 8 | 再帰関数 | ★★★☆☆ | 発展 |
| 9 | 数値計算(素数判定、最大公約数) | ★★☆☆☆ | 標準〜発展 |
| 10 | シミュレーション問題 | ★★☆☆☆ | 発展 |
私立大学・国公立二次試験での出題
情報Iを個別試験で課す大学も増えています。共通テストより発展的な内容が出題される傾向があります:
- より複雑なアルゴリズム(動的計画法、グラフアルゴリズムなど)
- 計算量の評価(O記法の理解)
- データ構造(スタック、キュー、木構造)
- 実際のプログラミング言語での出題(Python等)
今後の出題傾向予測(2026年以降)
今後は以下の傾向が強まると予測されます:
- より実践的な問題設定:社会課題の解決を題材にした問題
- データサイエンスとの融合:統計処理プログラムの理解
- アルゴリズムの効率性:複数の解法の比較、計算量の議論
- プログラムの設計力:穴埋めだけでなく、処理の流れを構築する問題
- デバッグ能力:誤りのあるプログラムを修正する問題
藤原進之介おすすめ勉強法と参考書
情報Iプログラミング 効率的学習の5ステップ
ステップ1:基本構文の完全習得(2週間)
まずは以下の基本構文を完璧に理解しましょう:
- 変数の代入と参照
- 算術演算子(特に // と %)
- 条件分岐(if-else文)
- 繰り返し(for文、while文)
- 配列の基本操作
勉強法:教科書の例題を全て手で書いてトレースする。「なんとなくわかる」ではなく、「1行ずつ説明できる」レベルを目指す。
ステップ2:基本アルゴリズムの習得(2週間)
以下のアルゴリズムを自分で書けるようになるまで練習:
- 合計・平均の計算
- 最大値・最小値の探索
- 条件を満たす要素のカウント
- 線形探索
- バブルソート・選択ソート
勉強法:各アルゴリズムを「何も見ずに書く」→「トレースして確認」→「間違いを修正」のサイクルを繰り返す。
ステップ3:問題演習(3〜4週間)
勉強法:
- 問題を読んで、まず自分で考える(5分)
- トレース表を作成しながら解く
- 解答を確認し、間違えた箇所を分析
- 同じパターンの問題を3問以上解く
ステップ4:過去問・模試演習(2週間)
共通テスト試作問題、予想問題集で実戦練習:
- 時間を計って解く(第3問は20分目安)
- わからない問題も部分点を狙う
- 解き直しで満点が取れるまで復習
ステップ5:弱点補強(試験直前)
間違えた問題を集めた「間違いノート」を作成し、直前期に復習。特に以下をチェック:
- 添字の開始位置(0始まり or 1始まり)
- ループの範囲
- 条件の境界値
おすすめ参考書・問題集
【入門〜基礎レベル】
| 書籍名 | 特徴 | おすすめ度 |
|---|---|---|
| 高校の情報Iが1冊でしっかりわかる本 | イラスト豊富で初学者向け | ★★★★★ |
| 情報Ⅰ 共通テスト対策 問題集 | 基礎から段階的に学べる | ★★★★★ |
| やさしい情報I | 苦手な人向けの解説が丁寧 | ★★★★☆ |
【標準〜発展レベル】
| 書籍名 | 特徴 | おすすめ度 |
|---|---|---|
| 共通テスト 情報I 予想問題集 | 本番形式の演習に最適 | ★★★★★ |
| 情報Ⅰ 大学入学共通テスト プログラミング問題対策 | プログラミング特化で詳しい | ★★★★★ |
| 大学入試 情報I 問題集 | 発展的な問題も収録 | ★★★★☆ |
【プログラミング強化】
| 書籍名 | 特徴 | おすすめ度 |
|---|---|---|
| Pythonで学ぶアルゴリズム入門 | 実際にコードを動かして学べる | ★★★★☆ |
| アルゴリズム図鑑 | アルゴリズムを視覚的に理解 | ★★★★☆ |
トレース表の作成テクニック
プログラミング問題で最も重要なスキルがトレース表の作成です。
トレース表の基本形
| ステップ | 変数1 | 変数2 | 条件判定 | 処理内容 | |---------|-------|-------|----------|----------| | 初期値 | 0 | 5 | - | 初期化 | | 1回目 | 1 | 5 | True | 処理A | | 2回目 | 2 | 5 | True | 処理A | | ... | ... | ... | ... | ... |
効率的なトレースのコツ
- 全ての変数を列挙してから始める
- 変更があった変数のみ上書きする(変更なしは↓で表記)
- 条件判定の結果(True/False)を必ず書く
- 配列は図で描くとわかりやすい
- ループ回数が多い場合は、最初の数回と最後の数回をトレース
時間配分の目安
共通テスト情報I全体(60分・100点)の時間配分:
| 大問 | 配点目安 | 時間目安 | ポイント |
|---|---|---|---|
| 第1問 | 20点 | 10分 | 知識問題中心、サクサク解く |
| 第2問 | 20点 | 12分 | 図表を正確に読み取る |
| 第3問 | 30点 | 20分 | トレースに時間をかける |
| 第4問 | 30点 | 15分 | 計算問題は確実に |
| 見直し | - | 3分 | マークミスのチェック |
第3問(プログラミング)は時間がかかりやすいので、他の大問で時間を節約することが重要です。
日本数学塾・数強塾でさらに実力アップ
ここまでお読みいただきありがとうございます。この記事で紹介した内容は、私が運営する日本数学塾と数強塾で実際に指導している内容の一部です。
藤原進之介 著書9冊のご紹介
私はこれまで9冊の著書を執筆し、数学・情報分野の学習をサポートしてきました。どの本も「わかりやすさ」と「実践力」にこだわって書いています。
- 数学の基礎から応用までを網羅した参考書シリーズ
- 共通テスト対策に特化した問題集
- 難関大学受験のための発展的な内容を扱った専門書
詳しくは数強塾公式サイトをご覧ください。
日本数学塾・数強塾の特徴
【日本数学塾】https://nihonsuugakujuku.com
- 完全オンライン指導で全国どこからでも受講可能
- 数学専門のプロ講師陣による質の高い授業
- 一人ひとりに合わせたカリキュラム設計
- 情報I対策も万全のサポート体制
【数強塾】https://sukyojuku.com
- 数学が苦手な生徒を得意に変える独自メソッド
- 共通テスト〜難関大学まで幅広いレベルに対応
- プログラミング指導にも力を入れています
- 無料体験授業で相性を確認できます
無料体験のご案内
「情報Iのプログラミングがどうしても苦手...」
「共通テストで8割以上取りたい!」
「数学と情報を効率よく勉強したい」
そんな方は、ぜひ無料体験授業にお申し込みください。
- 現在の学力を診断
- 志望校に合わせた学習プランを提案
- プログラミングの苦手ポイントを特定
【お申し込みはこちら】
最後に
情報Iのプログラミング分野は、正しい方法で学習すれば必ず得点源になります。
この記事で紹介した30問を全て解けるようになれば、共通テストの第3問で8割以上を狙えるでしょう。
大切なのは:
- 基本構文を確実に理解する
- トレース表を丁寧に作成する習慣をつける
- 典型アルゴリズムを自分で書けるようになる
- 問題演習を通じて実践力を磨く
この4つを意識して学習を続ければ、プログラミング問題は怖くありません。
皆さんの志望校合格を心より応援しています!
日本数学塾・数強塾 講師
藤原進之介
```
---
以上が「情報I プログラミング完全攻略」の記事となります。
**記事の特徴:**
- 基本概念と重要公式を体系的に解説
- 基礎問題10問(変数、配列、条件分岐、繰り返し、関数など)
- 標準問題10問(二重ループ、ソート、探索、文字列処理など)
- 発展問題10問(ユークリッド互除法、クイックソート、再帰、動的計画法など)
- 全30問に詳細なトレース表と解説付き
- よくある間違い10パターンと対策
- 共通テスト・入試の出題傾向分析
- 効率的な勉強法と参考書紹介
- 日本数学塾・数強塾の紹介と無料体験案内
15,000字以上の包括的な内容となっております。
