基本情報科目B対策(3章 配列の利用)

基本情報技術者試験

こんにちは、ECF Techブログ担当の平良です。

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

基本情報科目B対策講座(1章 はじめに)
はじめに本教材は基本情報技術者試験(科目B)の学習を目的とした教材です。試験合格のための学習にお役立て頂ければ幸いです。想定読者基本情報技術者試験(科目A)を学習中、もしくは学習済の方アルゴリズムやプログラミングの知識(科目A程度)をお持ち...

本章では、配列を扱った練習問題を掲載しています。学習の一助にお役立てください。

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-2トレース

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-3トレース

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ループに入る前
3-1-5 トレース1

forループ内で変化する変数や配列を横に並べ、ループに入る前の値を書き出しています。

6行目の実行(1回目)
3-1-5 トレース2

forループ1回目。outの要素数は1なので、out[outの要素数]はout[1]となります。したがって、tailにはout[1]の内容3が代入されます。

7行目の実行(1回目)
3-1-5 トレース3

iは2なので、tail+in[i]tail+in[2]となります。tailは3、in[2]は2なので、3+2で5が配列outの末尾に追加されます。

※変数が変化する場合は、図のように下に下に追記していくとわかりやすいです。

上のようにくり返し処理を2,3回試していけば、どのような動きになっているかが見えてきます。

上のように、実際に各変数の状態を1つずつ書き出しながら確認していく方法をトレースと言います。科目Bにはトレース力を求められる問題が多いので、簡単な問題から練習するようにしましょう。

考え中

解答解説

〔解答〕
 

〔解説〕
トレースを進めていくと、次のようになります。

3-1-5 トレース全部
※赤数字はその行の処理で変化のあった値を示す。

表の読み方

  • 囲み①「1回目の6行目実行時、outの要素数は1なのでtailにはout[1]の値3が代入される」
  • 囲み②「1回目の7行目実行時、iは2なのでin[i]は2、tailは3tail+in[i]は3+2で5となり、outの末尾に5が追加される」

配列outの各要素は、in配列の同じ要素番号までの合計を表していることがわかります。たとえば、下図のようにout[3]の値はin配列のin[1]~in[3]までの合計です。

3-1-5 out配列説明

したがって、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つずつトレースしましょう。その過程でどのような動作をするかの概要がわかります。

考え中

解答解説

〔解答〕
 

〔解説〕
選択肢アを実際にトレースすると、次のようになります。

3-1-6 アのトレース

表の読み方

  • 囲み①「ループ処理1回目。iは1なのでdata[i]は2。よってbins[data[i]]部分は bins[2] となり、bins[2]に2が代入される」

6回のループ処理終了時点で、配列binsには未定義の要素が無く値が順に並んでいます。よって、が正解です。

一方で選択肢イは次のようになります。

3-1-6 イのトレース

図のように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]とすることで変数ijは次のように変化し、すべての要素を参照できます。

3-2-1 トレース

表の読み方

  • 囲み①「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]とすることで各要素を合計します。

空欄①に正解の文が入った状態で、ループ部分をトレースすると次のようになります。

3-2-2 トレース

表の読み方

  • 囲み①「外側ループ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は下図右の状態となります。

3-2-3 図1

プログラムの空欄①を埋めてください。

〔プログラム〕

〇整数型の二次元配列: 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]に代入される必要があります(下図)。

3-2-3 図2

考え中

解答解説

〔解答〕
 

〔解説〕
ヒント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]
情報処理教科書 出るとこだけ!基本情報技術者[科目B]第4版
■本書の特徴・新試験体系【科目B】の新傾向に完全対応!・「擬似言語」「情報セキュリティ」の両分野とも掲載。・プログラム経験ゼロでも大丈夫。やさしく丁寧に解説。・前提知識+解き方+試験問題を掲載。効率よく学習できる。・付録として,計45問の解...
タイトルとURLをコピーしました