こんにちは、ECF Techブログ担当の平良です。
本記事は「基本情報技術者試験 科目B対策講座」の一部です。講座記事のすべてをご覧になりたい方は、下のリンクからご確認ください。

本章では、配列を扱った練習問題を掲載しています。学習の一助にお役立てください。
3-1 配列の利用
3-1-1 配列の参照
問題
[オリジナル問題]
配列の要素をすべて出力するプログラムです。プログラム中の空欄①を埋めてください。配列の要素番号は1から始まるものとします。
〔プログラム〕
整数型の配列 : ary ← {2, 4, 6, 8, 10} 整数型 : i for (i を 1 から aryの要素数 まで 1 ずつ増やす) ① を出力する
基礎知識
配列は下図のように、1つの変数名で複数の値の入れ物を扱います。
配列の各要素は変数名[要素番号]
のように記述し、参照することができます。上記のプログラムにおいてary[2]
と書くと4
を表すことになります。また、要素番号の部分には変数を用いることもできます。
解答解説
〔解答〕
①:ary[i]
〔解説〕
配列の要素を1つずつ参照する最も一般的な方法は、くり返し処理内で1ずつ増える変数を使うことです。プログラムでは変数iがそれに該当しますので、空欄①をary[i]
とすることで、配列のすべての要素を出力できます。
forループ内の5回の処理は下表のようになります。
3-1-2 配列要素の合計
問題
[オリジナル問題]
配列の各要素をすべて合計し、出力するプログラムです。プログラム中の空欄①を埋め、出力結果のとおりになるようにしてください。
〔プログラム〕
整数型の配列 : ary ← {2, 4, 6, 8, 10} 整数型 : i 整数型 : sum ← 0 for (i を 1 から aryの要素数 まで 1 ずつ増やす) ① endfor sum を出力
〔出力結果〕
30
ヒント1
配列の各要素を参照する考え方は3-1-1と同様です。合計の考え方は2-2-5のアルゴリズムを活用しましょう。
解答解説
〔解答〕
①:sum ← sum + ary[i]
〔解説〕
各配列を参照する記述はary[i]
となります。各要素を次々と変数sumに足しこみますので、sum ← sum + ary[i]
と書くことができます。くり返し処理内での各値の変化はつぎのようになります。
3-1-3 配列から最大値を見つける
問題
[オリジナル問題]
関数 arrayMax は、要素数2以上の整数型の配列を引数にとり、その中から最大値を見つけ、戻り値として返す関数です。プログラム中の空欄①②を埋めてください。
〔プログラム〕
〇整数型: arrayMax(整数型の配列: ary) 整数型: i ← 1 整数型: max ← ① for (i を 2 から aryの要素数 まで 1 ずつ増やす) if (②) max ← ary[i] endif endfor return max
ヒント1
空欄①では配列の最初の要素を仮の最大値とし、forループでは2番目の要素からチェックする方法を取っています。
if文内の処理で変数maxの値が更新されていますので、空欄②で新しい要素の方が大きいことを確認していることになります。
解答解説
〔解答〕
①:ary[1]
②:ary[i]>max
〔解説〕
空欄①はary[1]
とすることで、maxに配列の最初の要素を代入しています。以降、forループにおいて2番目の要素から値をチェックしています。
空欄②はary[i]>max
とし、現在の最大値max
よりも新しくチェックした値ary[i]
の方が大きい場合に、変数maxを更新しています。
下図は引数aryに渡された配列を仮定し、forループ部分の各くり返しの値の様子を示したものです。
3-1-4 配列の活用(1)
問題
[出典:令和6年度 ITパスポート試験 問62]
関数 convert は、整数型の配列を一定のルールで文字列に変換するプログラムである。関数 convert を convert(arrayInput)として呼び出したときの戻り値が “AABAB” になる引数 arrayInput の値はどれか。ここで、arrayInput の要素数は1以上とし、配列の要素番号は1から始まる。
〔プログラム〕
〇文字列型:convert(整数型の配列:arrayInput) 文字列型:stringOutput ← "" //空文字列を格納 整数型:i for(i を 1 から arrayInput の要素数まで 1 ずつ増やす) if (arrayInput[i]が 1 と等しい) stringoutputの未尾に ”A” を追加する else stringOutputの未尾に ”B” を追加する endif endfor return stringOutput
解答群
ア {0, 0, 1, 2, 1} イ {0, 1, 2, 1, 1}
ウ {1, 0, 1, 2, 0} エ {1, 1, 2, 1, 0}
ヒント1
プログラム動作を確認する問題です。選択肢の配列を使って、どのような動作をしているかを確認してみましょう。
選択肢アの配列を引数arrayInputに渡して実行した際、くり返し処理における動作は次のようになります。
よって、選択肢アは誤りであることがわかります。
解答解説
〔解答〕
エ
〔解説〕
配列の要素が1
の場合に"A"が文字列に追加されます。戻り値が“AABAB”になるためには、{1,1,?,1,?}
のように配列に1
が配置されている必要があります(※?は1以外の値を表す)。よって、正解はエとなります。
3-1-5 配列の活用(2)
問題
[出典:基本情報技術者試験 科目B サンプル問題 問3]
次の記述中のに入れる正しい答えを、解答群の中から選べ。ここで、配列の要素番号は1から始まる。
関数 makeNewArray は、要素数2以上の整数型の配列を引数にとり、整数型の配列を返す関数である。関数 makeNewArray を makeNewArray({3, 2, 1, 6, 5, 4})として呼び出したとき、戻り値の配列の要素番号5の値はとなる。
〔プログラム〕
〇整数型の配列:makeNewArray(整数型の配列:in) 整数型の配列:out ← {} //要素数0の配列 整数型: i, tail outの未尾に in[1]の値 を追加する for (i を 2 から inの要素数 まで 1 ずつ増やす) tail ← out[outの要素数] outの未尾に (tail + in[i]) の結果を追加する endfor return out
解答群
ア 5 イ 6 ウ 9 エ 11 オ 12 カ 17 キ 21
ヒント1
実行時の配列値を使って実際に試してみましょう。下表のようなものを手書きし、くり返し処理内の各変数の状態を書きだします。
(※実際の手書きはもっと簡易的で構いません)
forループに入る前
forループ内で変化する変数や配列を横に並べ、ループに入る前の値を書き出しています。
6行目の実行(1回目)
forループ1回目。outの要素数は1なので、out[outの要素数]
はout[1]となります。したがって、tailにはout[1]の内容3が代入されます。
7行目の実行(1回目)
iは2なので、tail+in[i]
はtail+in[2]となります。tailは3、in[2]は2なので、3+2で5が配列outの末尾に追加されます。
※変数が変化する場合は、図のように下に下に追記していくとわかりやすいです。
上のようにくり返し処理を2,3回試していけば、どのような動きになっているかが見えてきます。
解答解説
〔解答〕
カ
〔解説〕
トレースを進めていくと、次のようになります。
※赤数字はその行の処理で変化のあった値を示す。
表の読み方
- 囲み①「1回目の6行目実行時、outの要素数は1なのでtailにはout[1]の値3が代入される」
- 囲み②「1回目の7行目実行時、iは2なのでin[i]は2、tailは3。
tail+in[i]
は3+2で5となり、outの末尾に5が追加される」
配列outの各要素は、in配列の同じ要素番号までの合計を表していることがわかります。たとえば、下図のようにout[3]の値はin配列のin[1]~in[3]までの合計です。
したがって、out[5]の値はin[1]~in[5]までの合計値ということになります。3+2+1+6+5=17なので、正解は 17(カ) です。
3-1-6 配列の活用(3)
[出典:基本情報技術者試験 科目B サンプル問題 問11]
次の記述中のに入れる正しい答えを、解答群の中から選べ。ここで、配列の要素番号は1から始まる。
関数 binSort を binSort()として呼び出すと、戻り値の配列には未定義の要素は含まれておらず、値は昇順に並んでいる。
〔プログラム〕
〇整数型の配列:binSort(整数型の配列: data) 整数型: n ← dataの要素数 整数型の配列: bins ← {n個の未定義の値} 整数型: i for (i を 1 から n まで 1 ずつ増やす) bins[data[i]] ← data[i] endfor return bins
解答群
ア {2, 6, 3, 1, 4, 5} イ {3, 1, 4, 4, 5, 2}
ウ {4, 2, 1, 5, 6, 2} エ {5, 3, 4, 3, 2, 6}
ヒント1
選択肢を1つずつトレースしましょう。その過程でどのような動作をするかの概要がわかります。
解答解説
〔解答〕
ア
〔解説〕
選択肢アを実際にトレースすると、次のようになります。
表の読み方
- 囲み①「ループ処理1回目。iは1なのでdata[i]は2。よって
bins[data[i]]
部分は bins[2] となり、bins[2]に2が代入される」
6回のループ処理終了時点で、配列binsには未定義の要素が無く、値が順に並んでいます。よって、アが正解です。
一方で選択肢イは次のようになります。
図のようにbins[4]に2回代入が行われてしまい、最終的に未定義要素が残ります。したがって誤りとなります。
いくつかの選択肢をトレースする中で、次のルールに気づければベストです。
「戻り値の配列には未定義の要素は含まれておらず、値は昇順に並んでいる。」という条件を満たすには、引数dataが示す配列に重複する要素が無く、1~6までの値が網羅されていること
よって、重複する要素を持つウやエも誤りであることがわかります。
3-2 二次元配列の利用
3-2-1 二次元配列の出力
問題
[オリジナル問題]
二次元配列の各要素を順番に出力するプログラムです。出力結果のとおりとなるように、プログラム中の空欄①を埋めてください。
〔プログラム〕
整数型の二次元配列: ary ← {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 整数型: i, j for( i を 1 から 3 まで 1 ずつ増やす) for( j を 1 から 3 まで 1 ずつ増やす) ① を出力する endfor 改行を出力する endfor
[出力結果]
1 2 3 4 5 6 7 8 9
基礎知識
二次元配列は表構造と考えることができます。配列aryが示す二次元配列は下図のとおりです。値を参照する際は変数名[行][列]
のように指定します。
例えばary[1][2]
と記述すると、上図のオレンジ色の要素を示します。
ヒント1
二次元配列の各要素を参照する際の最も基本的な方法は二重ループを用いる方法です。2つの変数i
,j
を配列の要素番号として用いることで、すべての要素を参照できます。
解答解説
〔解答〕
①:ary[i][j]
〔解説〕
空欄①をary[i][j]
とすることで変数iとjは次のように変化し、すべての要素を参照できます。
表の読み方
- 囲み①「iは1、jは2なので、
ary[i][j]
は ary[1][2] となり、2を示す。」
3-2-2 配列ごとの合計
問題
[オリジナル問題]
二次元配列を行ごとに合計し、値を出力するプログラムです。出力結果のとおりとなるように、プログラム中の空欄①を埋めてください。
〔プログラム〕
整数型の二次元配列: ary ← {{1, 2, 3}, {2, 4, 6}, {3, 6, 9}} 整数型の変数: i, j 整数型の変数: sum ← 0 for( i を 1 から 3 まで 1 ずつ増やす) for( j を 1 から 3 まで 1 ずつ増やす) sum ← ① endfor sumを出力 改行を出力 ② endfor
〔出力結果〕
6 12 18
ヒント1
空欄①について
合計の考え方は2-2-5を確認しましょう。二次元配列の参照方法は3-2-1と同様です。
空欄②について
合計は行ごとに出力するので、出力後は一旦値をリセットする必要があります。
解答解説
〔解答〕
①:sum ← sum + ary[i][j]
②:sum ← 0
〔解説〕
まずは全体像を説明します。
- 外側のループは i行目の値をすべて足して出力 という処理をしています。
- 内側のループで i行目の各要素の値をsumに足しこむ という処理をしています。
合計を求める基本的な方法は、合計用の変数を準備し、次のように値を次々と足しこむ方法です。
合計用変数 ← 合計用変数 + 何らかの値
上記のプログラムでは合計用変数にsumを用いています。二次元配列の各要素はary[i][j]
のように書くことができますので、sum ← sum + ary[i][j]
とすることで各要素を合計します。
空欄①に正解の文が入った状態で、ループ部分をトレースすると次のようになります。
表の読み方
- 囲み①「外側ループ1回目の内側ループ1回目の7行目の処理。iは1、jは1なので、
sum+ary[i][j]
は1となり、sumに1が代入される。」
表から、外側ループ2回目の処理に入る前にsumを0に戻す必要があることがわかります。したがって、空欄②にはsum ← 0
が入ります。
3-2-3 図形の回転
問題
[オリジナル問題]
※基本情報技術者試験 科目A サンプル問題 問6を元に作成
関数rotateは、引数aryに表現された図形を元に、右に90度回転させた図形を持つretを戻り値として返すプログラムです。引数aryとretは8✕8の文字型の二次元配列で、空白と*で図形を表現します。引数aryが下図左の状態のとき、戻り値となる配列retは下図右の状態となります。
プログラムの空欄①を埋めてください。
〔プログラム〕
〇整数型の二次元配列: rotate(整数型の二次元配列: ary) 整数型: i, j 整数型の二次元配列: ret ← {8✕8の未定義の値} for( i を 1 から 8 まで 1 ずつ増やす) for( j を 1 から 8 まで 1 ずつ増やす) ① endfor endfor return ret
〔解答群〕
ア ret[8-i+1, 8-j+1] ← ary[i, j] イ ret[8-j+1, i] ← ary[i, j]
ウ ret[i, 8-j+1] ← ary[i, j] エ ret[j, 8-i+1] ← ary[i, j]
ヒント1
実際にいくつかの要素で試してみましょう。たとえばary[1][2]の要素は、ret[2][8]に代入される必要があります(下図)。
解答解説
〔解答〕
エ
〔解説〕
ヒント1にあるように、ret[2][8] ← ary[1][2]となる選択肢を考えます。iが1、jが2のとき、各選択肢のretの値は次のようになります。
- ア ret[8][7]
- イ ret[7][1]
- ウ ret[1][7]
- エ ret[2][8]
条件を満たすのはエだけとなります。
おわりに
今回は以上となります。最後までご活用いただき、ありがとうございました。配列は数多く出題されるテーマで、以降に登場する様々なアルゴリズムでも利用されます。くり返し問題を解いて、慣れておきましょう。
次章はスタックやリストなどのデータ構造を扱うプログラムを取り上げます。引き続き、どうぞよろしくお願いいたします。
[PR]
