【情報I アルゴリズムと流れ図】基礎から入試まで完全攻略|問題30問+解説|藤原進之介
```html
こんにちは!日本数学塾・数強塾の講師、藤原進之介です。
2025年度の大学入学共通テストから「情報I」が新たに加わり、多くの受験生が対策に悩んでいます。特に「アルゴリズムと流れ図」は、共通テストでも配点が高く、プログラミング問題の土台となる最重要分野です。
この記事では、フローチャートの基本記号から、共通テスト用プログラム表記(旧DNCL)の読み方、そして実際の入試レベルの問題まで、30問以上の練習問題と詳細解説を通じて完全攻略を目指します。「プログラミングは苦手...」という方も大丈夫。この記事を読み終える頃には、アルゴリズム問題に自信を持って取り組めるようになります!
この記事でわかること
- ✅ アルゴリズムとは何か:問題解決の「手順」を理解する
- ✅ 流れ図(フローチャート)の読み方・書き方:全ての記号を完全マスター
- ✅ 3つの基本構造:順次・分岐・反復を使いこなす
- ✅ 共通テスト用プログラム表記:擬似言語の文法と読み方
- ✅ トレース(変数追跡)のコツ:表を使った確実な解法
- ✅ 探索・整列アルゴリズム:線形探索・二分探索・ソートの理解
- ✅ 計算量の考え方:O(n)、O(log n)、O(n²)の違い
- ✅ 共通テスト・入試の出題傾向と対策:2025年度の分析を含む
- ✅ 30問の練習問題:基礎10問・標準10問・発展10問で段階的にレベルアップ
情報I アルゴリズムと流れ図 の基本概念と重要公式
1. アルゴリズムとは
アルゴリズム(Algorithm)とは、問題を解決するための明確な手順・手続きのことです。
日常生活でも、私たちは無意識にアルゴリズムを使っています。例えば:
- カップラーメンの作り方(お湯を沸かす→カップに注ぐ→3分待つ)
- 自動販売機での購入手順(お金を入れる→ボタンを押す→商品を取る)
- 電話帳から名前を探す方法
コンピュータのプログラムも、このような「手順」をコンピュータが理解できる形で記述したものです。
- 有限性:有限回の手順で必ず終了する
- 明確性:各手順が曖昧さなく定義されている
- 入出力:入力を受け取り、出力を生成する
2. 流れ図(フローチャート)の記号
アルゴリズムを視覚的に表現する方法が流れ図(フローチャート)です。以下の記号を完璧に覚えましょう。
| 記号 | 名称 | 意味・用途 | 例 |
|---|---|---|---|
| ○(楕円) | 端子記号 | 処理の開始と終了を表す | 「開始」「終了」 |
| □(長方形) | 処理記号 | 計算・代入などの処理を表す | 「x ← x + 1」「合計 ← 0」 |
| ◇(ひし形) | 判断記号 | 条件分岐を表す(Yes/No) | 「x > 0 ?」「i ≦ n ?」 |
| ▭(平行四辺形) | 入出力記号 | データの入力・出力を表す | 「nを入力」「結果を出力」 |
| ⬠(六角形) | ループ端記号 | 繰り返し処理の始点・終点 | 「i: 1, 1, n」 |
| →(矢印) | 流れ線 | 処理の流れを示す | 記号間をつなぐ |
| ○(小さな円) | 結合子 | 流れ図の接続点を示す | 「A」「1」 |
3. アルゴリズムの3つの基本構造
どんなに複雑なアルゴリズムも、以下の3つの構造の組み合わせで表現できます。これは「構造化定理」として知られています。
(1)順次構造(Sequential)
処理を上から下へ順番に実行する構造です。最も基本的な構造です。
処理A 処理B 処理C (Aの後にB、Bの後にCが実行される)
(2)分岐構造(Selection / 選択構造)
条件によって実行する処理を変える構造です。if文に対応します。
もし(条件)ならば
処理A
そうでなければ
処理B
(3)反復構造(Iteration / 繰り返し構造)
条件が満たされている間、同じ処理を繰り返す構造です。while文、for文に対応します。
【前判定型(while型)】
条件が成り立つ間繰り返す
処理A
【後判定型(do-while型)】
繰り返す
処理A
条件が成り立つまで
【回数指定型(for型)】
iを1からnまで1ずつ増やしながら繰り返す
処理A
4. 共通テスト用プログラム表記の文法
共通テストでは、共通テスト用プログラム表記(旧称:DNCL)という擬似言語が使用されます。以下が主要な文法です。
| 構文 | 意味 | 例 |
|---|---|---|
変数 ← 値 |
代入 | x ← 5 |
配列名[添字] |
配列要素へのアクセス | Data[3] |
もし 条件 ならば |
条件分岐(if) | もし x > 0 ならば |
そうでなくもし |
else if | そうでなくもし x = 0 ならば |
そうでなければ |
else | そうでなければ |
を実行し,条件 になるまで繰り返す |
後判定ループ | i ← i + 1 を実行し,i > n になるまで繰り返す |
条件 の間繰り返す |
前判定ループ(while) | i ≦ n の間繰り返す |
変数 を 初期値 から 終了値 まで 増分 ずつ増やしながら繰り返す |
カウンタループ(for) | i を 1 から n まで 1 ずつ増やしながら繰り返す |
表示する() |
出力 | 表示する(x) |
/* コメント */ |
コメント(説明) | /* 合計を計算 */ |
5. 比較演算子・論理演算子
| 演算子 | 意味 | 例 |
|---|---|---|
= |
等しい | x = 5 |
≠ |
等しくない | x ≠ 0 |
<, > |
より小さい、より大きい | x < 10 |
≦, ≧ |
以下、以上 | x ≦ 100 |
かつ |
論理積(AND) | x > 0 かつ x < 10 |
または |
論理和(OR) | x 100 |
でない |
否定(NOT) | x = 0 でない |
6. トレース(変数追跡)の方法
トレースとは、プログラムの実行過程を1行ずつ追跡し、変数の値の変化を記録する方法です。これはアルゴリズム問題を解く上で最も重要な技術です。
- 変数表を作る:各変数の列を作り、値の変化を記録
- 1行ずつ丁寧に:飛ばし読みせず、順番に処理を追う
- 条件式の真偽を確認:分岐・ループでは必ず条件を評価
- 配列は添字に注意:添字が0始まりか1始まりか確認
7. 代表的なアルゴリズム
【探索アルゴリズム】
線形探索(逐次探索)
- 先頭から順番に目的のデータを探す
- 計算量:O(n)(最悪の場合、n回の比較が必要)
- データが整列されていなくても使える
二分探索
- 整列されたデータの中央と比較し、探索範囲を半分に絞る
- 計算量:O(log n)(非常に高速)
- 前提条件:データが整列(ソート)されていること
【整列アルゴリズム(ソート)】
選択ソート
- 未整列部分から最小値を見つけ、先頭と交換
- 計算量:O(n²)
バブルソート
- 隣接する要素を比較・交換を繰り返す
- 計算量:O(n²)
8. 計算量(オーダー記法)
| 計算量 | 名称 | 特徴 | 例 |
|---|---|---|---|
| O(1) | 定数時間 | データ量に関係なく一定時間 | 配列の要素アクセス |
| O(log n) | 対数時間 | データ量が増えても緩やかに増加 | 二分探索 |
| O(n) | 線形時間 | データ量に比例して増加 | 線形探索 |
| O(n log n) | 準線形時間 | 効率的なソートアルゴリズム | マージソート、クイックソート |
| O(n²) | 二乗時間 | データ量の2乗に比例 | バブルソート、選択ソート |
基礎問題 10問(全問解説付き)
まずは基礎固めです。フローチャートの記号や基本的な処理の流れを確実に理解しましょう。
【基礎問題1】フローチャート記号の意味
【問題】
フローチャートで使用される以下の記号の名称と意味を答えなさい。
(1)楕円形(角丸の長方形)
(2)長方形
(3)ひし形
(4)平行四辺形
【考え方】
フローチャートの記号は、JIS規格で定められています。各記号が何を表すかを正確に覚えることが、流れ図を読む第一歩です。
【解法】
記号の形状と機能の対応関係を整理します。
【答】
(1)端子記号:処理の開始と終了を表す
(2)処理記号:計算・代入などの処理を表す
(3)判断記号:条件分岐(Yes/Noの判定)を表す
(4)入出力記号:データの入力・出力を表す
【基礎問題2】変数への代入
【問題】
次のプログラムを実行した後、変数xの値はいくつになるか。
x ← 3 x ← x + 5 x ← x * 2
【考え方】
「←」は代入を意味します。「x ← x + 5」は「xの現在の値に5を足した結果を、新たにxに代入する」という意味です。順番に追跡(トレース)していきます。
【解法】
| 行 | 処理 | xの値 |
|---|---|---|
| 1 | x ← 3 | 3 |
| 2 | x ← x + 5 = 3 + 5 | 8 |
| 3 | x ← x * 2 = 8 * 2 | 16 |
【答】 16
【基礎問題3】条件分岐(if文)
【問題】
次のプログラムを実行したとき、出力される値を答えなさい。
x ← 7
もし x > 10 ならば
y ← x * 2
そうでなければ
y ← x + 3
表示する(y)
【考え方】
条件分岐では、条件式の真偽を判定し、その結果に応じた処理を実行します。
【解法】
- x ← 7 で、xに7が代入される
- 条件「x > 10」を評価:7 > 10 は偽(False)
- 条件が偽なので「そうでなければ」の処理を実行
- y ← x + 3 = 7 + 3 = 10
【答】 10
【基礎問題4】繰り返し(カウンタ制御)
【問題】
次のプログラムを実行したとき、出力される値を答えなさい。
合計 ← 0
i を 1 から 5 まで 1 ずつ増やしながら繰り返す
合計 ← 合計 + i
表示する(合計)
</div
【考え方】
カウンタ制御の繰り返しでは、変数iが1から5まで順に変化しながら、ループ内の処理を繰り返します。各回のiの値を合計に加算していきます。
【解法】
| 回 | iの値 | 処理 | 合計の値 |
|---|---|---|---|
| 初期 | - | 合計 ← 0 | 0 |
| 1回目 | 1 | 合計 ← 0 + 1 | 1 |
| 2回目 | 2 | 合計 ← 1 + 2 | 3 |
| 3回目 | 3 | 合計 ← 3 + 3 | 6 |
| 4回目 | 4 | 合計 ← 6 + 4 | 10 |
| 5回目 | 5 | 合計 ← 10 + 5 | 15 |
1 + 2 + 3 + 4 + 5 = 15
【答】 15
【基礎問題5】配列の基本
【問題】
配列Dataに値 [10, 20, 30, 40, 50] が格納されている(添字は1から始まる)。次のプログラムを実行したとき、出力される値を答えなさい。
x ← Data[2] + Data[4] 表示する(x)
【考え方】
配列は複数のデータをまとめて格納するデータ構造です。添字(インデックス)を使って各要素にアクセスします。
【解法】
配列Dataの内容:
| 添字 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 値 | 10 | 20 | 30 | 40 | 50 |
- Data[2] = 20
- Data[4] = 40
- x = 20 + 40 = 60
【答】 60
【基礎問題6】while文による繰り返し
【問題】
次のプログラムを実行したとき、出力される値を答えなさい。
n ← 1
n < 100 の間繰り返す
n ← n * 2
表示する(n)
【考え方】
while文(前判定型ループ)は、条件を評価してからループ内の処理を実行します。条件が偽になった時点でループを抜けます。
【解法】
| 回 | 条件判定(n < 100) | 処理後のn |
|---|---|---|
| 初期 | - | 1 |
| 1回目 | 1 < 100 → 真 | 2 |
| 2回目 | 2 < 100 → 真 | 4 |
| 3回目 | 4 < 100 → 真 | 8 |
| 4回目 | 8 < 100 → 真 | 16 |
| 5回目 | 16 < 100 → 真 | 32 |
| 6回目 | 32 < 100 → 真 | 64 |
| 7回目 | 64 < 100 → 真 | 128 |
| 8回目 | 128 < 100 → 偽 | ループ終了 |
【答】 128
【基礎問題7】複合条件(かつ・または)
【問題】
次のプログラムで、変数resultに代入される値を答えなさい。
x ← 15
y ← 8
もし (x > 10 かつ y 10 または y > 10) ならば
result ← "B"
そうでなければ
result ← "C"
【考え方】
複合条件では、「かつ(AND)」は両方の条件が真のとき真、「または(OR)」は少なくとも一方が真のとき真になります。
【解法】
- x = 15, y = 8
- 最初の条件「x > 10 かつ y < 10」を評価
- x > 10 → 15 > 10 → 真
- y < 10 → 8 < 10 → 真
- 真 かつ 真 → 真
- 条件が真なので、result ← "A" が実行される
【答】 "A"
【基礎問題8】配列の走査
【問題】
配列Numに [3, 7, 2, 9, 5] が格納されている(添字は1から始まる)。次のプログラムを実行したとき、出力される値を答えなさい。
最大 ← Num[1]
i を 2 から 5 まで 1 ずつ増やしながら繰り返す
もし Num[i] > 最大 ならば
最大 ← Num[i]
表示する(最大)
【考え方】
このアルゴリズムは、配列から最大値を見つける処理です。最初の要素を暫定の最大値とし、残りの要素と比較しながら更新していきます。
【解法】
| i | Num[i] | 条件(Num[i] > 最大) | 最大の値 |
|---|---|---|---|
| 初期 | - | - | 3(Num[1]) |
| 2 | 7 | 7 > 3 → 真 | 7 |
| 3 | 2 | 2 > 7 → 偽 | 7 |
| 4 | 9 | 9 > 7 → 真 | 9 |
| 5 | 5 | 5 > 9 → 偽 | 9 |
【答】 9
【基礎問題9】カウンタ変数の利用
【問題】
配列Scoreに [85, 72, 90, 68, 95, 78] が格納されている(添字は1から始まる)。次のプログラムを実行したとき、出力される値を答えなさい。
count ← 0
i を 1 から 6 まで 1 ずつ増やしながら繰り返す
もし Score[i] ≧ 80 ならば
count ← count + 1
表示する(count)
【考え方】
このアルゴリズムは、条件を満たす要素の個数を数えます。カウンタ変数countを用意し、条件に合致するたびに1を加算します。
【解法】
配列Scoreの各要素について、80以上かどうかを判定:
| i | Score[i] | 80以上? | countの値 |
|---|---|---|---|
| 初期 | - | - | 0 |
| 1 | 85 | 真 | 1 |
| 2 | 72 | 偽 | 1 |
| 3 | 90 | 真 | 2 |
| 4 | 68 | 偽 | 2 |
| 5 | 95 | 真 | 3 |
| 6 | 78 | 偽 | 3 |
【答】 3(80点以上の科目は3つ)
【基礎問題10】二重ループの基本
【問題】
次のプログラムを実行したとき、変数countの最終的な値を答えなさい。
count ← 0
i を 1 から 3 まで 1 ずつ増やしながら繰り返す
j を 1 から 4 まで 1 ずつ増やしながら繰り返す
count ← count + 1
表示する(count)
【考え方】
二重ループでは、外側のループが1回実行されるごとに、内側のループが全回数実行されます。
【解法】
- 外側のループ:iが1から3まで → 3回
- 内側のループ:jが1から4まで → 4回
- 「count ← count + 1」が実行される回数 = 3 × 4 = 12回
【答】 12
標準問題 10問(全問解説付き)
基礎を固めたら、入試頻出パターンの問題に挑戦しましょう。
【標準問題1】線形探索アルゴリズム
【問題】
配列Dataに [15, 23, 8, 42, 16, 31] が格納されている(添字は1から始まり、要素数は6)。次のプログラムは、配列から値keyを探索するアルゴリズムである。key = 42 のとき、出力される値を答えなさい。
key ← 42
found ← -1
i を 1 から 6 まで 1 ずつ増やしながら繰り返す
もし Data[i] = key ならば
found ← i
表示する(found)
【考え方】
線形探索(逐次探索)は、配列の先頭から順番にデータを比較していくアルゴリズムです。見つかった場合、その位置(添字)を記録します。
【解法】
| i | Data[i] | Data[i] = 42? | foundの値 |
|---|---|---|---|
| 初期 | - | - | -1 |
| 1 | 15 | 偽 | -1 |
| 2 | 23 | 偽 | -1 |
| 3 | 8 | 偽 | -1 |
| 4 | 42 | 真 | 4 |
| 5 | 16 | 偽 | 4 |
| 6 | 31 | 偽 | 4 |
【答】 4(42は配列の4番目にある)
【標準問題2】二分探索アルゴリズム
【問題】
昇順に整列された配列Dataに [5, 12, 18, 25, 33, 41, 56] が格納されている(添字は1から7)。次の二分探索プログラムでkey = 33を探すとき、変数midが取る値を実行順に全て答えなさい。
key ← 33
left ← 1
right ← 7
found ← 0
left ≦ right かつ found = 0 の間繰り返す
mid ← (left + right) ÷ 2 の商
もし Data[mid] = key ならば
found ← mid
そうでなくもし Data[mid] < key ならば
left ← mid + 1
そうでなければ
right ← mid - 1
表示する(found)
【考え方】
二分探索は、整列されたデータの中央と目標値を比較し、探索範囲を半分に絞り込んでいくアルゴリズムです。
【解法】
| 回 | left | right | mid | Data[mid] | 比較結果 | 処理 |
|---|---|---|---|---|---|---|
| 1回目 | 1 | 7 | 4 | 25 | 25 < 33 | left ← 5 |
| 2回目 | 5 | 7 | 6 | 41 | 41 > 33 | right ← 5 |
| 3回目 | 5 | 5 | 5 | 33 | 33 = 33 | found ← 5 |
【答】 midが取る値(順に):4, 6, 5
【標準問題3】選択ソートの理解
【問題】
配列Aに [64, 25, 12, 22, 11] が格納されている。次の選択ソートアルゴリズムを1回のパス(外側ループ i=1 のとき)実行した後の配列の状態を答えなさい。
n ← 5
i を 1 から n-1 まで 1 ずつ増やしながら繰り返す
min_idx ← i
j を i+1 から n まで 1 ずつ増やしながら繰り返す
もし A[j] < A[min_idx] ならば
min_idx ← j
/* A[i]とA[min_idx]を交換 */
temp ← A[i]
A[i] ← A[min_idx]
A[min_idx] ← temp
【考え方】
選択ソートは、未整列部分から最小値を見つけて先頭に移動させる操作を繰り返します。
【解法】
i = 1 のパス:
- min_idx ← 1(初期値)、A[1] = 64
- j = 2: A[2] = 25 < A[1] = 64 → min_idx ← 2
- j = 3: A[3] = 12 < A[2] = 25 → min_idx ← 3
- j = 4: A[4] = 22 > A[3] = 12 → 変更なし
- j = 5: A[5] = 11 < A[3] = 12 → min_idx ← 5
- A[1]とA[5]を交換:11と64を交換
【答】 [11, 25, 12, 22, 64]
【標準問題4】バブルソートの比較回数
【問題】
要素数nの配列をバブルソートで昇順に整列するとき、要素の比較が行われる回数を求める式を答えなさい。
i を 1 から n-1 まで 1 ずつ増やしながら繰り返す
j を 1 から n-i まで 1 ずつ増やしながら繰り返す
もし A[j] > A[j+1] ならば
/* A[j]とA[j+1]を交換 */
【考え方】
二重ループの構造を分析し、内側ループが何回実行されるかを数えます。
【解法】
- i = 1 のとき、j は 1 から n-1 まで → (n-1)回の比較
- i = 2 のとき、j は 1 から n-2 まで → (n-2)回の比較
- i = 3 のとき、j は 1 から n-3 まで → (n-3)回の比較
- ...
- i = n-1 のとき、j は 1 から 1 まで → 1回の比較
合計:(n-1) + (n-2) + ... + 2 + 1 = n(n-1)/2
【答】 n(n-1)/2 回(計算量は O(n²))
【標準問題5】フラグ変数の利用
【問題】
次のプログラムは、整数nが素数かどうかを判定するアルゴリズムである。n = 17 のとき、出力される結果を答えなさい。
n ← 17
isPrime ← 1 /* 1:素数と仮定, 0:素数でない */
もし n < 2 ならば
isPrime ← 0
そうでなければ
i を 2 から n-1 まで 1 ずつ増やしながら繰り返す
もし n を i で割った余り = 0 ならば
isPrime ← 0
もし isPrime = 1 ならば
表示する("素数です")
そうでなければ
表示する("素数ではありません")
【考え方】
素数とは、1と自分自身以外に約数を持たない2以上の整数です。2からn-1までの数で割り切れるかどうかを調べます。フラグ変数isPrimeは、割り切れる数が見つかったら0に変更されます。
【解法】
- n = 17, isPrime = 1(初期値)
- n ≧ 2 なので「そうでなければ」の処理へ
- i を 2 から 16 まで繰り返し:
- 17 ÷ 2 の余り = 1 ≠ 0
- 17 ÷ 3 の余り = 2 ≠ 0
- 17 ÷ 4 の余り = 1 ≠ 0
- ... (すべての除算で余りが0にならない)
- 17 ÷ 16 の余り = 1 ≠ 0
- isPrimeは1のまま変更されない
- isPrime = 1 なので「素数です」を出力
【答】 「素数です」
【標準問題6】累積和の計算
【問題】
配列Aに [3, 1, 4, 1, 5, 9, 2, 6] が格納されている(添字は1から8)。次のプログラムで作成される配列Sの内容を全て答えなさい。
S[0] ← 0
i を 1 から 8 まで 1 ずつ増やしながら繰り返す
S[i] ← S[i-1] + A[i]
【考え方】
累積和(prefix sum)は、配列の先頭からある位置までの合計を事前に計算しておくテクニックです。S[i]は、A[1]からA[i]までの合計を表します。
【解法】
| i | A[i] | S[i] = S[i-1] + A[i] | S[i]の値 |
|---|---|---|---|
| 0 | - | 初期値 | 0 |
| 1 | 3 | 0 + 3 | 3 |
| 2 | 1 | 3 + 1 | 4 |
| 3 | 4 | 4 + 4 | 8 |
| 4 | 1 | 8 + 1 | 9 |
| 5 | 5 | 9 + 5 | 14 |
| 6 | 9 | 14 + 9 | 23 |
| 7 | 2 | 23 + 2 | 25 |
| 8 | 6 | 25 + 6 | 31 |
【答】 S = [0, 3, 4, 8, 9, 14, 23, 25, 31](S[0]からS[8]まで)
【標準問題7】文字列処理(文字数カウント)
【問題】
文字列strに "ABRACADABRA" が格納されている(添字は1から始まる、文字数は11)。次のプログラムを実行したとき、出力される値を答えなさい。
target ← "A"
count ← 0
i を 1 から 11 まで 1 ずつ増やしながら繰り返す
もし str[i] = target ならば
count ← count + 1
表示する(count)
【考え方】
文字列を1文字ずつ走査し、目標の文字と一致するものをカウントします。
【解法】
文字列 "ABRACADABRA" の各位置:
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 文字 | A | B | R | A | C | A | D | A | B | R | A |
| "A"? | ○ | × | × | ○ | × | ○ | × | ○ | × | × | ○ |
"A"は位置 1, 4, 6, 8, 11 に出現 → 5個
【答】 5
【標準問題8】最大公約数(ユークリッドの互除法)
【問題】
次のプログラムは、2つの正の整数a, bの最大公約数を求めるユークリッドの互除法である。a = 48, b = 18 のとき、出力される値と、ループが実行される回数を答えなさい。
a ← 48
b ← 18
b ≠ 0 の間繰り返す
r ← a を b で割った余り
a ← b
b ← r
表示する(a)
【考え方】
ユークリッドの互除法は、「2つの数の最大公約数は、大きい方を小さい方で割った余りと小さい方の最大公約数に等しい」という性質を利用します。
【解法】
| 回 | a | b | r = a mod b | 処理後(a, b) |
|---|---|---|---|---|
| 初期 | 48 | 18 | - | - |
| 1回目 | 48 | 18 | 48 mod 18 = 12 | (18, 12) |
| 2回目 | 18 | 12 | 18 mod 12 = 6 | (12, 6) |
| 3回目 | 12 | 6 | 12 mod 6 = 0 | (6, 0) |
| 終了 | 6 | 0 | b = 0で終了 | - |
【答】 出力される値:6、ループ実行回数:3回
【標準問題9】配列の逆順処理
【問題】
配列Aに [1, 2, 3, 4, 5, 6] が格納されている(添字は1から6)。次のプログラムを実行した後の配列Aの内容を答えなさい。
n ← 6
i を 1 から n ÷ 2 まで 1 ずつ増やしながら繰り返す
temp ← A[i]
A[i] ← A[n - i + 1]
A[n - i + 1] ← temp
【考え方】
配列を逆順にするには、先頭と末尾、2番目と末尾から2番目、...というように対称な位置の要素を交換します。要素数が6の場合、交換は3回(n÷2回)行います。
【解法】
| i | 交換位置 | 交換する値 | 配列の状態 |
|---|---|---|---|
| 初期 | - | - | [1, 2, 3, 4, 5, 6] |
| 1 | A[1] ↔ A[6] | 1 ↔ 6 | [6, 2, 3, 4, 5, 1] |
| 2 | A[2] ↔ A[5] | 2 ↔ 5 | [6, 5, 3, 4, 2, 1] |
| 3 | A[3] ↔ A[4] | 3 ↔ 4 | [6, 5, 4, 3, 2, 1] |
【答】 [6, 5, 4, 3, 2, 1]
【標準問題10】条件付き合計(フィルタリング)
【問題】
配列Dataに [12, 5, 18, 3, 21, 9, 15, 7] が格納されている(添字は1から8)。次のプログラムを実行したとき、出力される2つの値を答えなさい。
sumEven ← 0 /* 偶数の合計 */
sumOdd ← 0 /* 奇数の合計 */
i を 1 から 8 まで 1 ずつ増やしながら繰り返す
もし Data[i] を 2 で割った余り = 0 ならば
sumEven ← sumEven + Data[i]
そうでなければ
sumOdd ← sumOdd + Data[i]
表示する(sumEven)
表示する(sumOdd)
【考え方】
整数を2で割った余りが0なら偶数、1なら奇数です。条件に応じて別々の変数に合計を累積します。
【解法】
| Data[i] | 余り | 偶数/奇数 | sumEven | sumOdd |
|---|---|---|---|---|
| 12 | 0 | 偶数 | 12 | 0 |
| 5 | 1 | 奇数 | 12 | 5 |
| 18 | 0 | 偶数 | 30 | 5 |
| 3 | 1 | 奇数 | 30 | 8 |
| 21 | 1 | 奇数 | 30 | 29 |
| 9 | 1 | 奇数 | 30 | 38 |
| 15 | 1 | 奇数 | 30 | 53 |
| 7 | 1 | 奇数 | 30 | 60 |
【答】 sumEven = 30、sumOdd = 60
発展・入試レベル問題 10問(全問解説付き)
ここからは共通テストや大学入試レベルの問題です。複合的な思考力が求められます。
【発展問題1】共通テスト型:プログラムの穴埋め
【問題】
次のプログラムは、配列Aから2番目に大きい値を求めるアルゴリズムである。空欄ア、イに入る適切な式を答えなさい。配列Aには異なる値が5個以上格納されているものとする。
n ← (配列Aの要素数)
max1 ← A[1] /* 最大値 */
max2 ← A[2] /* 2番目に大きい値 */
もし max1 max1 ならば
max2 ← 【 ア 】
max1 ← A[i]
そうでなくもし 【 イ 】 ならば
max2 ← A[i]
表示する(max2)
【考え方】
2番目に大きい値を求めるには、最大値と2番目の値を両方管理する必要があります。新しい最大値が見つかったとき、これまでの最大値は2番目になります。また、最大値より小さいが2番目より大きい値が見つかった場合は、2番目を更新します。
【解法】
空欄ア:新しい最大値A[i]が見つかったとき、これまでの最大値max1が2番目に大きい値になる。
→ max1
空欄イ:A[i]が最大値より小さいが、現在の2番目の値max2より大きい場合、max2を更新する。
→ A[i] > max2
【答】 ア:max1、イ:A[i] > max2
【発展問題2】共通テスト型:アルゴリズムの目的理解
【問題】
次のプログラムは何を求めるアルゴリズムか、最も適切なものを選びなさい。また、配列Aに [4, 2, 4, 3, 2, 4, 1] が格納されているとき、出力される値を答えなさい。
n ← 7
Count ← [0, 0, 0, 0, 0] /* Count[1]~Count[5]を0で初期化 */
i を 1 から n まで 1 ずつ増やしながら繰り返す
Count[A[i]] ← Count[A[i]] + 1
maxCount ← 0
result ← 0
j を 1 から 5 まで 1 ずつ増やしながら繰り返す
もし Count[j] > maxCount ならば
maxCount ← Count[j]
result ← j
表示する(result)
① 配列Aの最大値 ② 配列Aの最小値 ③ 最も頻繁に出現する値(最頻値) ④ 配列Aの中央値
【考え方】
このアルゴリズムは2つのフェーズから成ります:
- Count配列で各値の出現回数をカウント
- 最も出現回数が多い値を探す
【解法】
配列A = [4, 2, 4, 3, 2, 4, 1] のカウント処理:
| 値 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| Count | 1 | 2 | 1 | 3 | 0 |
最大のCountを探す:
- Count[1] = 1、Count[2] = 2、Count[3] = 1、Count[4] = 3、Count[5] = 0
- 最大はCount[4] = 3
- result = 4
【答】 アルゴリズムの目的:③ 最も頻繁に出現する値(最頻値)、出力される値:4
【発展問題3】再帰的アルゴリズム(階乗)
【問題】
次のプログラムは、nの階乗(n!)を計算する再帰的なアルゴリズムである。factorial(5)を呼び出したとき、関数factorialが呼び出される回数と、最終的な戻り値を答えなさい。
関数 factorial(n)
もし n ≦ 1 ならば
戻り値 1
そうでなければ
戻り値 n × factorial(n - 1)
【考え方】
再帰関数は、自分自身を呼び出す関数です。階乗の定義 n! = n × (n-1)! を直接コードにしています。
【解法】
factorial(5)の呼び出しを追跡:
| 呼び出し | n | 処理 | 戻り値 |
|---|---|---|---|
| 1回目 | 5 | 5 × factorial(4) | 5 × 24 = 120 |
| 2回目 | 4 | 4 × factorial(3) | 4 × 6 = 24 |
| 3回目 | 3 | 3 × factorial(2) | 3 × 2 = 6 |
| 4回目 | 2 | 2 × factorial(1) | 2 × 1 = 2 |
| 5回目 | 1 | n ≦ 1 なので終了 | 1 |
【答】 呼び出し回数:5回、戻り値:120
【発展問題4】共通テスト型:スケジュール問題
【問題】
3人の部員(A, B, C)が9つの作品を制作する。各作品の制作日数が配列Daysに格納されている。次のプログラムは、各部員に作品を割り当て、全員が作業を終える最短日数を求めるアルゴリズムである。
Days = [5, 3, 8, 2, 7, 4, 6, 1, 9](添字は1から9)のとき、出力される値を答えなさい。
Work ← [0, 0, 0] /* 各部員の作業日数(Work[1]がA, Work[2]がB, Work[3]がC)*/
i を 1 から 9 まで 1 ずつ増やしながら繰り返す
/* 最も作業日数が少ない部員を探す */
minIdx ← 1
j を 2 から 3 まで 1 ずつ増やしながら繰り返す
もし Work[j] maxWork ならば
maxWork ← Work[k]
表示する(maxWork)
【考え方】
これは「貪欲法(グリーディ法)」の一種で、各作品を割り当てる際に、現時点で最も作業量が少ない部員に割り当てます。全員が終わる日数は、最も作業量が多い部員の日数になります。
【解法】
| i | Days[i] | 割当先 | Work[1](A) | Work[2](B) | Work[3](C) |
|---|---|---|---|---|---|
| 初期 | - | - | 0 | 0 | 0 |
| 1 | 5 | A(minIdx=1) | 5 | 0 | 0 |
| 2 | 3 | B(minIdx=2) | 5 | 3 | 0 |
| 3 | 8 | C(minIdx=3) | 5 | 3 | 8 |
| 4 | 2 | B(minIdx=2) | 5 | 5 | 8 |
| 5 | 7 | A(minIdx=1) | 12 | 5 | 8 |
| 6 | 4 | B(minIdx=2) | 12 | 9 | 8 |
| 7 | 6 | C(minIdx=3) | 12 | 9 | 14 |
| 8 | 1 | B(minIdx=2) | 12 | 10 | 14 |
| 9 | 9 | B(minIdx=2) | 12 | 19 | 14 |
最終的なWork = [12, 19, 14]
最大値 = 19
【答】 19(日)
【発展問題5】文字列のパターンマッチング
【問題】
次のプログラムは、文字列textの中からパターンpatternを探索するアルゴリズムである。text = "ABCABCABC"、pattern = "CAB" のとき、出力される値を全て答えなさい。
textLen ← 9
patLen ← 3
i を 1 から textLen - patLen + 1 まで 1 ずつ増やしながら繰り返す
match ← 1 /* 一致フラグ */
j を 1 から patLen まで 1 ずつ増やしながら繰り返す
もし text[i + j - 1] ≠ pattern[j] ならば
match ← 0
もし match = 1 ならば
表示する(i)
【考え方】
これは単純なパターンマッチング(力任せ法)です。textの各位置からpatternと比較し、完全に一致したらその開始位置を出力します。
【解法】
text = "ABCABCABC"、pattern = "CAB"
比較範囲:i = 1 から 9 - 3 + 1 = 7 まで
| i | 比較部分文字列 | pattern | 一致? |
|---|---|---|---|
| 1 | ABC | CAB | × |
| 2 | BCA | CAB | × |
| 3 | CAB | CAB | ○ |
| 4 | ABC | CAB | × |
| 5 | BCA | CAB | × |
| 6 | CAB | CAB | ○ |
| 7 | ABC | CAB | × |
【答】 3 と 6(パターンが見つかった開始位置)
【発展問題6】二次元配列(行列)の処理
【問題】
3×3の二次元配列Mが以下のように定義されている。次のプログラムを実行したとき、出力される3つの値を答えなさい。
M = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
/* M[行][列] で添字は1から始まる */
sum1 ← 0
sum2 ← 0
sum3 ← 0
i を 1 から 3 まで 1 ずつ増やしながら繰り返す
sum1 ← sum1 + M[i][i] /* 処理A */
sum2 ← sum2 + M[i][4-i] /* 処理B */
sum3 ← sum3 + M[2][i] /* 処理C */
表示する(sum1)
表示する(sum2)
表示する(sum3)
【考え方】
二次元配列の添字を分析することで、どの要素にアクセスしているかを特定します。
- 処理A:M[i][i] → 対角成分(左上から右下)
- 処理B:M[i][4-i] → 逆対角成分(右上から左下)
- 処理C:M[2][i] → 2行目の全要素
【解法】
配列Mの構造:
| 列1 | 列2 | 列3 | |
|---|---|---|---|
| 行1 | 1 | 2 | 3 |
| 行2 | 4 | 5 | 6 |
| 行3 | 7 | 8 | 9 |
sum1(対角成分):
- i=1: M[1][1] = 1
- i=2: M[2][2] = 5
- i=3: M[3][3] = 9
- sum1 = 1 + 5 + 9 = 15
sum2(逆対角成分):
- i=1: M[1][3] = 3
- i=2: M[2][2] = 5
- i=3: M[3][1] = 7
- sum2 = 3 + 5 + 7 = 15
sum3(2行目):
- i=1: M[2][1] = 4
- i=2: M[2][2] = 5
- i=3: M[2][3] = 6
- sum3 = 4 + 5 + 6 = 15
【答】 sum1 = 15、sum2 = 15、sum3 = 15
【発展問題7】シミュレーション(待ち行列)
【問題】
次のプログラムは、フィボナッチ数列の第n項を求めるアルゴリズムである。n = 8 のとき、出力される値と、ループが実行される回数を答えなさい。
n ← 8
F ← [0, 0, 0, 0, 0, 0, 0, 0] /* 要素数8の配列 */
F[1] ← 1
F[2] ← 1
i を 3 から n まで 1 ずつ増やしながら繰り返す
F[i] ← F[i-1] + F[i-2]
表示する(F[n])
【考え方】
フィボナッチ数列は、各項が前2項の和になる数列です。F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2) という漸化式で定義されます。
【解法】
| i | F[i-1] | F[i-2] | F[i] |
|---|---|---|---|
| 1 | - | - | 1(初期値) |
| 2 | - | - | 1(初期値) |
| 3 | 1 | 1 | 2 |
| 4 | 2 | 1 | 3 |
| 5 | 3 | 2 | 5 |
| 6 | 5 | 3 | 8 |
| 7 | 8 | 5 | 13 |
| 8 | 13 | 8 | 21 |
ループはi=3から8まで → 6回実行
【答】 出力される値:21、ループ実行回数:6回
【発展問題8】計算量の比較
【問題】
要素数1000000(100万)の整列済み配列から特定の値を探索する。線形探索と二分探索それぞれについて、最悪の場合に必要な比較回数の概算を答えなさい。また、二分探索が線形探索より効率的である理由を簡潔に説明しなさい。
【考え方】
- 線形探索の計算量:O(n) → 最悪でn回の比較
- 二分探索の計算量:O(log₂n) → 最悪でlog₂n回の比較
【解法】
線形探索:
最悪の場合(目的の値が末尾または存在しない場合)、全要素を比較する必要がある。
比較回数 = 1,000,000回
二分探索:
各比較で探索範囲が半分になるため、log₂(1,000,000) 回の比較で済む。
log₂(1,000,000) ≈ log₂(2²⁰) = 20 (実際は約19.93)
比較回数 ≈ 20回
【答】
- 線形探索:約1,000,000回
- 二分探索:約20回
- 理由:二分探索は各比較で探索範囲を半分に絞り込むため、データ量が増えても比較回数の増加が非常に緩やかである。線形探索がデータ量に比例して比較回数が増えるのに対し、二分探索は対数的にしか増えない。
【発展問題9】共通テスト型:複合問題
【問題】
次のプログラムは、配列Priceの各要素に対して、割引後の価格を計算するアルゴリズムである。空欄ア~ウに入る適切な式または値を答えなさい。
【割引ルール】
- 1000円未満:割引なし
- 1000円以上3000円未満:10%引き
- 3000円以上:20%引き
Price ← [800, 1500, 3500, 2000, 500]
n ← 5
i を 1 から n まで 1 ずつ増やしながら繰り返す
もし Price[i] ≧ 【 ア 】 ならば
Price[i] ← Price[i] × 【 イ 】
そうでなくもし Price[i] ≧ 1000 ならば
Price[i] ← Price[i] × 【 ウ 】
/* 1000円未満は処理なし */
i を 1 から n まで 1 ずつ増やしながら繰り返す
表示する(Price[i])
【考え方】
条件分岐は上から順に評価されるため、より厳しい条件(3000円以上)を先に判定します。割引率は「残りの割合」を掛けることで計算します。
【解法】
- 空欄ア:3000円以上の条件 → 3000
- 空欄イ:20%引き = 80%残り → 0.8
- 空欄ウ:10%引き = 90%残り → 0.9
検証:
| 元の価格 | 条件 | 計算 | 割引後 |
|---|---|---|---|
| 800 | 1000未満 | 割引なし | 800 |
| 1500 | 1000以上3000未満 | 1500 × 0.9 | 1350 |
| 3500 | 3000以上 | 3500 × 0.8 | 2800 |
| 2000 | 1000以上3000未満 | 2000 × 0.9 | 1800 |
| 500 | 1000未満 | 割引なし | 500 |
【答】 ア:3000、イ:0.8、ウ:0.9
【発展問題10】アルゴリズムの改良
【問題】
次のプログラムAとプログラムBは、どちらも1からnまでの整数の合計を求めるアルゴリズムである。それぞれの計算量を答え、nが非常に大きい場合にどちらが効率的か理由とともに説明しなさい。
【プログラムA】
n ← 1000000
sum ← 0
i を 1 から n まで 1 ずつ増やしながら繰り返す
sum ← sum + i
表示する(sum)
【プログラムB】
n ← 1000000
sum ← n × (n + 1) ÷ 2
表示する(sum)
【考え方】
プログラムAは繰り返し処理で合計を計算し、プログラムBは公式(等差数列の和の公式)を使って直接計算します。
【解法】
プログラムAの計算量:
- ループがn回実行される
- 各回で加算処理が1回
- 計算量:O(n)
プログラムBの計算量:
- 乗算、加算、除算がそれぞれ1回ずつ
- ループなし
- 計算量:O(1)(定数時間)
効率性の比較:
| n | プログラムA(O(n)) | プログラムB(O(1)) |
|---|---|---|
| 100 | 約100回の演算 | 約3回の演算 |
| 1,000,000 | 約100万回の演算 | 約3回の演算 |
| 1,000,000,000 | 約10億回の演算 | 約3回の演算 |
【答】
- プログラムA:O(n)
- プログラムB:O(1)
- プログラムBの方が効率的。理由:プログラムAはnに比例して処理時間が増加するが、プログラムBは公式を使うことでnの大きさに関係なく一定時間で計算が完了する。nが100万のとき、プログラムAは100万回のループが必要だが、プログラムBはわずか数回の演算で済む。数学的な公式を活用することで、アルゴリズムの効率を劇的に改善できる好例である。
よくある間違いと完全対策
アルゴリズムと流れ図の問題で、受験生がよく陥る間違いとその対策をまとめました。
間違い1:添字の開始位置を勘違いする
【よくある間違い】
配列の添字が「0から始まる」のか「1から始まる」のかを確認せずに解答してしまう。
【対策】
- 問題文で「添字は0から始まる」「添字は1から始まる」の記述を必ず確認
- 共通テストでは通常「1から始まる」ことが多いが、問題ごとに確認が必要
- トレース表を作るときは、添字と値を明確に区別して記入
間違い2:ループの終了条件を誤読する
【よくある間違い】
- 「i < n」と「i ≦ n」の違いを見落とす
- 「〜まで繰り返す」(後判定)と「〜の間繰り返す」(前判定)を混同する
【対策】
- 「i < n」:iがn未満の間(nは含まない)
- 「i ≦ n」:iがn以下の間(nを含む)
- 前判定型(while):条件を先に判定 → 条件が最初から偽なら1回も実行されない
- 後判定型(do-while):処理を先に実行 → 最低1回は実行される
- 迷ったら具体的な数値で確認する習慣をつける
間違い3:代入と比較を混同する
【よくある間違い】
「x ← 5」(代入)と「x = 5」(比較)の意味を混同してしまう。
【対策】
- 「←」:代入(右辺の値を左辺の変数に格納する)
- 「=」:比較(左辺と右辺が等しいかどうかを判定する、結果は真または偽)
- 共通テスト用プログラム表記では、代入は必ず「←」で表記される
間違い4:条件式の評価順序を誤る
【よくある間違い】
「かつ」「または」を含む複合条件で、評価の優先順位を間違える。
【対策】
- 「かつ」(AND):両方が真のときだけ真
- 「または」(OR):少なくとも一方が真なら真
- 優先順位:「でない(NOT)」>「かつ(AND)」>「または(OR)」
- 複雑な条件は、各部分を個別に評価してから組み合わせる
【例】 x = 5, y = 3 のとき「x > 3 かつ y < 5 または x < 0」を評価
- x > 3 → 5 > 3 → 真
- y < 5 → 3 < 5 → 真
- x < 0 → 5 < 0 → 偽
- 「かつ」を先に評価:真 かつ 真 → 真
- 「または」を評価:真 または 偽 → 真
間違い5:トレースを省略する
【よくある間違い】
「だいたいわかった」と思って、トレース(変数追跡)を省略し、暗算で解こうとする。
【対策】
- 必ず表を書く:変数の列を作り、各ステップでの値を記録
- 特にループ処理では、各反復での変数の変化を丁寧に追跡
- 時間がかかっても、確実に正解できる方法を選ぶ
- 練習を重ねると、トレースのスピードは自然と上がる
間違い6:二分探索の前提条件を忘れる
【よくある間違い】
二分探索は「整列されたデータ」でしか使えないことを忘れ、未整列のデータに適用しようとする。
【対策】
- 二分探索の前提:データが昇順または降順に整列されていること
- 問題文で「整列済み」「ソート済み」の記述を確認
- 未整列データに対しては線形探索を使う
間違い7:境界値の処理ミス
【よくある間違い】
配列の先頭・末尾、ループの最初・最後など、境界付近でのミスが多い。
【対策】
- 境界値(最初と最後の値)で必ず動作確認する習慣をつける
- 「n-1」「n+1」「i-1」「i+1」などの式は特に注意
- 配列外アクセス(存在しない添字へのアクセス)がないか確認
共通テスト・大学入試での出題傾向
2025年度共通テストの分析
2025年度から共通テストに「情報I」が新設されました。初年度の出題傾向を分析します。
【第3問:プログラミング分野の特徴】
- 配点:25点(全体100点中)
- 題材:実生活に関連した問題設定(2025年度は「工芸部の作品制作スケジュール」)
- 出題形式:
- プログラムの穴埋め問題
- トレース結果を問う問題
- アルゴリズムの目的・動作を問う問題
- プログラムの改良・修正に関する問題
- 使用言語:共通テスト用プログラム表記(日本語ベースの擬似言語)
頻出テーマ・パターン
| テーマ | 出題頻度 | 具体例 |
|---|---|---|
| 配列の走査 | ★★★★★ | 合計・平均・最大最小値の計算、条件に合う要素のカウント |
| 探索アルゴリズム | ★★★★☆ | 線形探索、二分探索 |
| 整列アルゴリズム | ★★★★☆ | 選択ソート、バブルソート(動作の理解が中心) |
| 条件分岐の組み合わせ | ★★★★☆ | 複数条件での分類、ネストしたif文 |
| 二重ループ | ★★★☆☆ | 二次元配列の処理、全ペアの比較 |
| 文字列処理 | ★★★☆☆ | 文字のカウント、パターンマッチング |
| シミュレーション | ★★★☆☆ | スケジュール問題、ゲームのルール実装 |
| 計算量の理解 | ★★☆☆☆ | O(n)とO(log n)の違い、効率の比較 |
得点アップのための戦略
【戦略1】基本パターンを完璧にマスター
以下の基本パターンは確実に解けるようにしておく:
- 配列の合計・平均・最大・最小の計算
- 条件を満たす要素のカウント
- 線形探索の実装と動作理解
- 単純な条件分岐の処理
【戦略2】トレース力を鍛える
プログラムを見たら即座にトレースできるよう、日頃から練習する。表を書くスピードと正確性が得点に直結する。
【戦略3】問題文を丁寧に読む
情報Iの問題は文章量が多い傾向がある。以下の点に注意:
- 配列の添字の開始位置
- 変数の初期値
- ループの範囲と条件
- アルゴリズムの目的(何を求めようとしているか)
【戦略4】時間配分を意識
情報Iは60分で大問4つ。プログラミング問題(第3問)は15〜18分を目安に解く。トレースに時間をかけすぎないよう、練習で時間感覚を身につける。
藤原進之介おすすめ勉強法と参考書
段階別学習ロードマップ
【STEP 1】基礎固め期(2〜3週間)
目標:フローチャートの記号、3つの基本構造、変数・配列の概念を完全に理解する
学習内容:
- 教科書の該当範囲を精読
- フローチャートを自分で書いてみる
- 簡単なプログラムのトレースを繰り返す
チェックポイント:基礎問題10問が全て自力で解ける
【STEP 2】パターン習得期(3〜4週間)
目標:頻出アルゴリズムのパターンを習得する
学習内容:
- 線形探索、二分探索の動作とコードを暗記レベルで理解
- 選択ソート、バブルソートの動作を説明できるようにする
- 様々な条件分岐パターンの問題を解く
チェックポイント:標準問題10問が8割以上正解できる
【STEP 3】実践演習期(4〜6週間)
目標:入試レベルの問題に対応できる力をつける
学習内容:
- 共通テスト試作問題・過去問を解く
- 時間を計って演習する
- 間違えた問題は必ず復習し、なぜ間違えたかを分析
チェックポイント:発展問題が7割以上正解、制限時間内に解ける
効果的な学習のコツ
🔑 コツ1:手を動かして学ぶ
プログラムを「読む」だけでなく、必ず自分でトレース表を書く。書くことで理解が深まり、記憶にも定着する。
🔑 コツ2:実際にプログラムを動かしてみる
余裕があれば、Python等の実際のプログラミング言語で同じアルゴリズムを実装してみる。動作を目で確認することで理解が深まる。
🔑 コツ3:「なぜそうなるか」を常に考える
答えが合っていても、「なぜその答えになるのか」を説明できるようにする。これが応用力につながる。
🔑 コツ4:間違いノートを作る
間違えた問題とその原因を記録する。同じミスを繰り返さないために非常に効果的。
おすすめ参考書・教材
| レベル | 教材名 | 特徴 |
|---|---|---|
| 入門 | 高校教科書(情報I) | 基礎概念の理解に最適。まずはここから |
| 基礎〜標準 | 共通テスト対策問題集(各社) | パターン別の演習に最適 |
| 標準〜発展 | 大学入学共通テスト試作問題・過去問 | 本番形式の演習。必ず取り組むべき |
| 発展 | 基本情報技術者試験の参考書(アルゴリズム分野) | より深くアルゴリズムを学びたい人向け |
日本数学塾・数強塾でさらに実力アップ
📚 プロ講師による個別指導で確実に得点アップ!
情報Iのアルゴリズム分野は、独学では「なんとなくわかった気がする」で終わってしまいがちです。日本数学塾・数強塾では、プロ講師があなたの理解度に合わせて丁寧に指導します。
【日本数学塾・数強塾の特徴】
- ✅ 完全1対1の個別指導:あなたのペースで、わからないところを徹底解説
- ✅ オンライン対応:全国どこからでも受講可能
- ✅ 情報I対策コース:アルゴリズム・プログラミング分野を重点的に指導
- ✅ 共通テスト対策に完全対応:最新の出題傾向を踏まえた指導
- ✅ 数学との相乗効果:論理的思考力を数学と情報の両面から鍛える
【藤原進之介の著書紹介】
私、藤原進之介はこれまで9冊の著書を出版し、多くの受験生の学力向上に貢献してきました。数学的思考力とプログラミング的思考力は密接に関連しており、両方を伸ばすことで大きな相乗効果が得られます。
🎁 無料体験授業 実施中!
「本当に自分に合うか不安...」という方のために、無料体験授業をご用意しています。まずはお気軽にお問い合わせください。
まとめ
この記事では、情報Iの「アルゴリズムと流れ図」について、基礎から入試レベルまで徹底解説しました。
【この記事のポイント】
- 基本をしっかり固める:フローチャートの記号、3つの基本構造(順次・分岐・反復)を完璧に
- トレースを徹底する:変数の値の変化を表にして追跡する習慣をつける
- 頻出パターンを習得:線形探索、二分探索、ソートアルゴリズムの動作を理解
- 計算量の概念を理解:O(n)、O(log n)、O(n²)の違いを把握
- 実践演習を重ねる:共通テスト形式の問題で実力を磨く
アルゴリズムの学習は、最初は難しく感じるかもしれませんが、基本パターンを理解し、トレースの練習を重ねることで、確実に得点できる分野になります。この記事で紹介した30問を繰り返し解いて、アルゴリズム問題を得点源にしていきましょう!
質問や不明点があれば、ぜひ数強塾・日本数学塾の無料体験でお気軽にご相談ください。皆さんの合格を心から応援しています!
日本数学塾・数強塾 講師
藤原進之介
【付録】重要用語・公式一覧
最後に、試験直前の確認用として重要な用語と公式をまとめました。
フローチャート記号一覧
| 記号 | 名称 | 用途 |
|---|---|---|
| 楕円 | 端子記号 | 開始・終了 |
| 長方形 | 処理記号 | 計算・代入 |
| ひし形 | 判断記号 | 条件分岐 |
| 平行四辺形 | 入出力記号 | データの入出力 |
| 六角形 | ループ端記号 | 繰り返しの範囲 |
| 矢印 | 流れ線 | 処理の流れ |
共通テスト用プログラム表記 チートシート
| 構文 | 意味 |
|---|---|
変数 ← 値 |
代入 |
配列[添字] |
配列要素へのアクセス |
もし 条件 ならば ~ |
if文(条件分岐) |
そうでなくもし 条件 ならば ~ |
else if文 |
そうでなければ ~ |
else文 |
条件 の間繰り返す ~ |
while文(前判定ループ) |
~ を実行し,条件 になるまで繰り返す |
do-while文(後判定ループ) |
変数 を 初期値 から 終了値 まで 増分 ずつ増やしながら繰り返す |
for文(カウンタループ) |
表示する(値) |
出力 |
a を b で割った余り |
剰余(mod)演算 |
a を b で割った商 |
整数除算 |
論理演算子
| 演算子 | 意味 | 真になる条件 |
|---|---|---|
A かつ B |
論理積(AND) | AもBも両方真のとき |
A または B |
論理和(OR) | AかBの少なくとも一方が真のとき |
A でない |
否定(NOT) | Aが偽のとき |
計算量(オーダー)一覧
| 計算量 | 名称 | n=1000のとき | 代表的なアルゴリズム |
|---|---|---|---|
| O(1) | 定数時間 | 1回 | 配列の添字アクセス、公式による計算 |
| O(log n) | 対数時間 | 約10回 | 二分探索 |
| O(n) | 線形時間 | 1,000回 | 線形探索、配列の走査 |
| O(n log n) | 準線形時間 | 約10,000回 | マージソート、クイックソート |
| O(n²) | 二乗時間 | 1,000,000回 | バブルソート、選択ソート |
頻出アルゴリズムの比較回数
| アルゴリズム | 比較回数(最悪) | 前提条件 |
|---|---|---|
| 線形探索 | n回 | なし |
| 二分探索 | log₂n回 | 整列済みデータ |
| バブルソート | n(n-1)/2回 | なし |
| 選択ソート | n(n-1)/2回 | なし |
重要公式
【等差数列の和】
1 + 2 + 3 + ... + n = n(n+1)/2
【二分探索の最大比較回数】
⌈log₂n⌉ + 1 回(⌈ ⌉は切り上げ)
【バブルソート・選択ソートの比較回数】
n(n-1)/2 回
【二重ループの実行回数】
外側ループ回数 × 内側ループ回数
【付録2】トレース練習用テンプレート
以下のテンプレートを印刷またはノートに書いて、トレース練習に活用してください。
基本トレース表
| ステップ | 実行される処理 | 変数1 | 変数2 | 変数3 | 備考 |
|---|---|---|---|---|---|
| 初期 | |||||
| 1 | |||||
| 2 | |||||
| 3 | |||||
| 4 | |||||
| 5 |
配列トレース表
| 添字 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| 初期値 | ||||||||
| 処理後 |
🎯 この記事が役に立ったら...
ぜひお友達にもシェアしてください!
また、さらに詳しい解説や個別指導をご希望の方は、
数強塾・日本数学塾の無料体験にお申し込みください。
© 日本数学塾・数強塾 藤原進之介
```
以上で「情報I アルゴリズムと流れ図」の完全攻略記事が完成しました。
この記事には以下の内容が含まれています:
1. **基本概念の解説**:フローチャート記号、3つの基本構造、共通テスト用プログラム表記の文法
2. **基礎問題10問**:変数・配列・条件分岐・繰り返しの基本
3. **標準問題10問**:線形探索・二分探索・ソート・文字列処理など入試頻出パターン
4. **発展問題10問**:共通テスト型の穴埋め・複合問題・計算量の理解
5. **よくある間違いと対策**:添字、ループ条件、代入と比較の混同など7つの頻出ミス
6. **出題傾向分析**:2025年度共通テストの分析と得点戦略
7. **勉強法と参考書**:段階別ロードマップと効果的な学習のコツ
8. **付録**:用語・公式一覧、トレース練習用テンプレート
合計で約15,000字以上の詳細な解説となっています。
