
武蔵野個別指導塾の特徴
共通テスト情報I 配列の添字—番号と要素の対応を整理して参照先を追う|武蔵野個別指導塾

1始まりと0始まりを表で区別し、隣の要素を読む範囲まで追う配列の添字を学びます。
よくあるのは、高校生が1始まりの配列を0始まりとして読み、指定された番号の次の値を選んでしまう場面です。値の並びを正確に見ていても、最初の箱に付いた番号を取り違えると、後の参照先がずれます。配列の問題では、まず番号と値の対応を書き、式の中の番号を決めてから、その箱の中身を読みます。
番号を決めてから中身を見る
出方の1つは、添字を指定して要素を取り出す型です。配列の先頭に付く番号が0か1かを確認し、指定の番号の箱を探します。左から何番目かという日常の数え方と、問題で定めた添字は一致するとは限りません。
もう1つは、添字を変えながら隣り合う要素を扱う型です。現在の番号と、その1つ後の番号をそれぞれ計算します。最後の要素にも後ろの隣があると思い込むと、配列の範囲を越えます。繰り返しの終点がどちらの参照まで許すかを調べることが必要です。
さらに、参照した値を別の添字として使う型もあります。内側の参照を先に終え、得た値が外側の配列で使える番号かを確かめます。番号が範囲外なら、その問題の定義が結果を与えない限り、別の値を勝手に補ってはいけません。ここでは配列の参照を中心に扱い、整列や探索の手法には広げません。
箱に付く番号と箱に入る値
配列は、複数の値を順に並べ、それぞれを番号で指定して扱う仕組みです。各値を要素、その位置を指定する番号を添字と呼びます。添字自体も数値であるため、要素の値と混同しやすいのですが、添字は箱の名札、要素は箱の中身です。
図1のように、値が左から 8、3、6 と並ぶ配列 A を考えます。この問題では添字を1から始めます。A[1] は先頭の 8、A[2] は 3、A[3] は 6 です。添字の範囲は1から3までで、A[0] と A[4] は定義されません。角括弧の中の数は値そのものではなく、参照する場所を指定します。

同じ3個を0始まりで定義した別の配列なら、番号は0、1、2です。値の順番を変えなくても、同じ値を指す番号は変わります。一般に要素が n 個なら、1始まりの範囲は1から n、0始まりの範囲は0から n − 1です。空の配列には要素がないので、どの添字でも要素を参照できません。
式 A[i + 1] は、まず i に1を足して添字を求め、その番号の箱を読みます。A[i] + 1 は、先に A[i] の中身を読み、その値に1を足します。括弧の内側にあるかどうかで、足す対象が変わります。図1で i が1なら、前者は A[2] の3、後者は8に1を足した9です。どちらも添字1の箱を起点にしていますが、同じ計算ではありません。
基本例題:隣の箱との差を記録する
展示の準備で使う枚数を、左から 5、8、6、10 と並べた配列 B に記録します。添字は1から始まり、B[1] から B[4] までが有効です。次の自作の手順で出力される3個の整数を、出力順に答えてください。
i を 1 から 3 まで 1 ずつ増やして繰り返す
d ← B[i + 1] - B[i]
d を出力する
ここで ← は右側を計算した結果を左側の変数に入れる代入です。繰り返しは開始値と終了値を含みます。出力は各回の代入直後に行います。減算の結果は負の数になってもそのまま出力します。
まず B の対応表を作ります。添字1、2、3、4に対して値は順に5、8、6、10です。i は値の番号であって枚数ではありません。i が1のとき、i + 1 は2なので、B[2] の8から B[1] の5を引き、d は3です。ここで3が出力されます。
図2のように、2回目は i が2です。B[3] は6、B[2] は8なので、d は -2 です。3回目は i が3で、B[4] の10から B[3] の6を引き、d は4です。したがって答えは順に 3、-2、4 です。

差を元の枚数へ戻しても確かめられます。5に3を加えると8、8に -2 を加えると6、6に4を加えると10です。隣の2個が逆になっていれば符号が反対になります。最終回の参照先は3と4で、どちらも有効です。仮に i を4まで進めると B[5] が必要になり、この配列では参照できません。
出力を繰り返しの後に置く変更も、元の手順とは別です。その場合は各回の値を順に出すのではなく、最後に残った d を1回出すことになります。参照先を正しく選んでも、出力の位置を読み落とすと求める個数が違います。
もう一段:値を次の番号として使う
配列 C は0始まりで、添字0から3に順に 2、0、3、1 を格納します。j を0から始め、次の手順を2回実行します。2回目の終了後の j を整数で答えてください。各回の代入では、右側の参照を終えてから j を更新します。
j ← 0
2回繰り返す
j ← C[j]
最初の j は0です。1回目は C[0] の中身2を読み、j を2に更新します。2回目は更新後の j を添字に使うため、C[2] の3を読み、j は3になります。答えは3です。元の表で C[0] が2、C[2] が3であることに戻れば、2回の移動を確かめられます。C[3] の1を読むのは3回目なので、今回の答えには使いません。
この問題の各値は0から3の範囲にあり、2回の参照先も有効です。ただし、要素の値は常に有効な添字とは限りません。例えば C[0] が4だったとした場合、1回目の代入で j は4になりますが、2回目に C[4] を参照しようとすると範囲外です。この変更後の手順では2回目を完了できず、元の問題の答え3を流用できません。
反復が0回なら、参照をせず初期値0が残ります。配列を空に変更した場合も、0回なら参照は起こりませんが、1回以上なら最初の C[0] が範囲外です。こうした場合の表示や例外処理は手順に定められていないので、特定の表示が出るとは判断しません。0回で初期値が残ることと、空の配列で参照できることは別の話です。
ずれた答えをどこから直すか
基本例題で最初の差を -2 としたとします。これは B[2] と B[3] を先に選んだ場合の差です。原因は、1始まりと定めた B の先頭を添字0だと思い、添字1を2番目の値8に割り当てたことにあります。差の計算自体は6から8を引いており、計算ミスを探すだけでは参照のずれを直せません。
図3のように、まず B[1] の下に5、B[2] の下に8を書き直します。次に i が1の行で、i + 1 が2になることを示します。参照する2つの値が5と8だと決まってから、8から5を引きます。答えは3に修正されます。

別の誤りは、最終回を確認せず、i を4まで進めることです。B[4] は存在しますが、式には B[i + 1] もあるため、同じ回に B[5] が必要です。片方の参照が有効でも、もう片方の安全は保証されません。各参照の添字を別々に書いて、両方が範囲内かを確認します。
また、負の差を見て0に直すのも、この手順にはない操作です。手順が負の値を認めているかを問題文で確かめ、条件にない補正を加えずに答えます。間違いを直す際には、番号の対応、添字の式、値の計算、出力の順に戻ると、どこで食い違ったかを特定できます。
範囲を確かめるときの手順
隣の差を求める処理では、要素の個数と、処理できる隣接組の個数を分けて数えます。基本例題では要素が4個で、隣接する組は添字1と2、2と3、3と4の3組です。添字4を左側にすると、その右側に必要な添字5はありません。逆に、開始値を2にすると最初の組を飛ばすため、範囲外にはならなくても目的の3組を扱えません。安全に実行できることと、目的の組を漏らさず扱うことの両方が必要です。表の各組に印を付ければ、重複や抜けも順に点検できます。初回と最終回の2つの端を、一覧と照合しましょう。
要素が1個の配列に同じ目的を当てはめれば、隣接する組は0組です。繰り返しを0回にするよう定義されていれば、差の出力も0個です。要素がない配列でも組はありません。要素数が少ないときは、最初の参照が存在するか確認してから処理に入ります。範囲外を参照した場合に何が表示されるかは、処理系や問題で与えた規則に依存するため、この手順からは決まりません。
要素の値が等しい場合も位置は別です。例えば隣の2個がともに7なら差は0であり、2つの添字が同じになったわけではありません。添字と値を2行に分けて書けば、同じ値が繰り返されても、どの箱を読んだかを区別できます。図の矢印を値から値へ引くだけでなく、その下に参照元と参照先の番号を添えることが有効です。
練習:参照先を紙に書く
次の4問は互いに独立しています。各問の配列は問題文の順に格納され、変更しないものとします。答えは指定された形で書いてください。
問1
配列 D の要素は左から 12、7、9、4 で、添字は1から始まります。D[3] と D[1 + 1] の値を、この順に整数で答えてください。添字の計算に使う + は加算です。
問2
配列 E の要素は左から 4、11、2、8 で、添字は0から始まります。i を0から2まで1ずつ増やし、各回に E[i + 1] から E[i] を引いて出力します。端点を含み、出力は各回に行います。出力される整数を順に答えてください。
問3
配列 F の要素は左から 1、2、0 で、添字は0から始まります。j を1として、j ← F[j] を2回繰り返します。← は右側の値を左側へ代入する記号です。2回目の後の j を整数で答えてください。
問4
1始まりで要素が5個ある配列 G について、整数 i に対して G[i] と G[i + 1] の両方を参照します。両方の添字が有効な i の範囲を、両端を含む整数の範囲で答えてください。配列の中身の値は問わないものとします。
練習の答えと確かめ方
問1は 9、7 です。D[3] は左から3番目の9です。もう一方は先に 1 + 1 を計算し、D[2] の7を読みます。元の並びに戻ると添字3は9、添字2は7なので、指定された順と合います。9と2を足す問題ではなく、括弧内の番号を決める問題です。
問2は 7、-9、6 です。添字0から3の値は4、11、2、8です。i が0、1、2の各回に、それぞれ11 − 4、2 − 11、8 − 2を計算します。元の値に戻すと4に7を加えて11、11に -9 を加えて2、2に6を加えて8です。最終回も添字2と3を参照しており、範囲内です。i を3にすると添字4が必要なので、実行範囲に含められません。
問3は 0 です。初期値1から F[1] の2を読み、j は2になります。次に F[2] の0を読むので、2回目の後は0です。配列に戻って、1から2、2から0とたどれます。0を得た時点で2回が終わるため、さらに F[0] を読む必要はありません。要素の値が重複していても、同じ値を持つ箱が同じ位置とは限らず、その回に指定された添字を優先します。
問4は 1から4 です。G[i] が有効な条件は i が1から5、G[i + 1] が有効な条件は i + 1 が1から5です。共通する整数は1、2、3、4です。端の1では添字1と2、端の4では4と5を参照し、両方が存在します。0では G[0]、5では G[6] が範囲外となり、どちらも条件を満たしません。5個の要素があることと、隣接する組が5組あることは同じではありません。
手元に残すこと
添字の起点と終点を、値の並びの上に書きます。 括弧内を計算し、得た番号が範囲内か調べます。 参照した値と、参照先の番号を別々に記録します。 隣を読むときは両方の添字と最終回を確認します。 出力する位置と、繰り返しが0回の場合も見ます。
つまずきを見分けるために
最初の値からずれているなら、計算を続ける前に配列の対応表へ戻ります。途中からずれたなら、その回の変数の更新前後と、括弧の中の式を並べて確認します。個別指導で確かめるときも、答えだけでなく、どの添字からどの値を読んだかを声に出してたどると、起点の誤りと計算の誤りを分けられます。
範囲外の参照が現れた場合は、その直前までの記録を残し、必要になった番号と有効な端点を比べます。手順にない値を補わず、どの回で参照が成立しなくなるかを示すことが、配列を正確に読むための根拠です。
もう「日東駒専」を目標にしないでください。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。




