情報Ⅰプログラミング問題の解き方|コードを読む前に変数の役割を書く

情報Ⅰのプログラミング問題は、コードを上から眺めて「何となく動きを想像する」とミスしやすくなります。先に、変数が何を表すのか、どこで値が変わるのか、条件分岐と繰り返しが何を判定しているのかを書き出すと、長いコードでも追いやすくなります。

まず変数の「役割」を日本語で書く

たとえば次のような擬似コードを考えます。

total ← 0
for i = 1 to 5
    total ← total + i
end

ここで i は「今何回目か」を表す変数、total は「これまでの合計」を保存する変数です。

コードを読む前に、

  • i:1から5まで変化する回数
  • total:合計
    と書くだけで、total ← total + i の意味が見えやすくなります。

変数名が a や x でも、問題文から役割を日本語へ戻すことが大切です。

代入は「等しい」ではなく「右の値を左へ入れる」

プログラミングで

x ← x + 1

と書かれていても、数学の等式 x=x+1 ではありません。

右辺の x+1 を先に計算し、その結果を左辺のxへ保存します。

たとえばx=4なら、右辺は5になり、その5をxへ入れるので、処理後のxは5です。

「←」を数学のイコールとして読むと、更新処理が理解できなくなります。

変数の値は表で追う

次のコードを考えます。

x ← 2
y ← 3
x ← x + y
y ← x - 1

処理ごとに表を作ります。

処理後 x y
初期値 2 3
x ← x + y 5 3
y ← x - 1 5 4

最後の y ← x - 1 では、xはすでに5へ更新されています。

コードを頭の中だけで追うより、行ごとに状態を書き換える方が確実です。

条件分岐は「条件が真か偽か」を一回ずつ判定する

if score >= 60
    result ← "pass"
else
    result ← "retry"
end

score=75なら score >= 60 は真なのでpass、score=50なら偽なのでretryです。

難しい問題では条件が複数あります。たとえば

if a > 0 and b > 0

なら、aとbの両方が正のときだけ真です。

条件式を読んだら、文章へ言い換えます。
「aが正で、かつbも正なら」
と書くだけで、and/orの混同を減らせます。

繰り返しは「何回目か」と「更新後の値」を分ける

次を考えます。

s ← 0
for i = 1 to 4
    s ← s + 2*i
end

i=1ならs=2、i=2ならs=6、i=3ならs=12、i=4ならs=20です。

i その回で足す値 s
1 2 2
2 4 6
3 6 12
4 8 20

「4回繰り返す」だけを見ず、各回で変数がどう変わるかを記録します。

よくある誤りは「更新前」と「更新後」を混ぜること

a ← 3
a ← a * 2
b ← a + 1

このときbは4ではなく7です。2行目でaが6へ更新されているからです。

一度値が変わった変数は、その後の処理では新しい値を使います。

問題用紙の余白へ、
a: 3 → 6
のように履歴を書いておくと、古い値を使うミスを防げます。

配列は「何番目に何が入っているか」を先に確認する

配列を使う問題では、要素番号が0から始まるか1から始まるかを確認します。

data = [5, 8, 2, 9]

ある擬似言語で先頭が0番なら、data[2] は3番目の2です。先頭が1番なら意味が変わります。

問題文や共通テスト用の擬似コードのルールを確認せず、普段使う言語の感覚で決めないようにします。

関数は「入力→処理→出力」で読む

関数が出てきたら、細かな処理へ入る前に、

  • 何を受け取るか
  • 何を返すか
    を確認します。

たとえば

function double(x)
    return 2*x
end

なら、「数xを受け取り、その2倍を返す」です。

関数名や中身が長くても、入口と出口が分かれば全体コードでの役割を追いやすくなります。

練習:最大値を更新するコードを追う

data = [4, 9, 3, 7]
max ← data[0]

for each x in data
    if x > max
        max ← x
    end
end

初期のmaxは4です。

x=4では更新なし、x=9でmax=9、x=3では更新なし、x=7でも更新なし。

最後は9です。

ここで重要なのは、max が「今までに見た最大値」を保存していると役割を言葉にすることです。

コードを書き写す前に三つを余白へ作る

問題を見たら、次の三つを先に作ります。

  1. 変数表:変数名と役割
  2. 状態表:処理ごとの値
  3. 条件文の日本語訳:何なら分岐するか

この三つがあれば、長い擬似コードでも「どこを追えばよいか」が明確になります。

コードの意味とアルゴリズムの目的を分ける

一行ずつ正しく追えても、「結局このプログラムは何をしているのか」が分からないことがあります。

最大値探索なら「今までの最大値を保存し、より大きい値が出たら更新する」というアルゴリズムです。

処理を追った後、最後に一文で目的を言い直すと、別の数値や別の変数名へ変わっても同じ構造だと気づけます。

次は条件を一つ変えて再トレースする

完成したコードに対して、

  • 初期値を変える
  • 繰り返し回数を変える
  • > を >= に変える
    など、一条件だけ変えます。

そして最終値がどう変わるかを表で追います。

プログラミング問題は、コードを暗記する単元ではありません。状態がどう変化するかを、変数・条件・繰り返しの三つに分けて追跡することで、初見のコードにも対応しやすくなります。

参考資料

  • 文部科学省「高等学校学習指導要領 情報編」
おすすめの記事