基本情報技術者試験〔科目B〕演習2022年サンプル問題 問11(一元配列)
問11(一元配列)
次のプログラム中の□に入れる正しい答えを、解答群の中から選べ。ここで、配列の要素番号は1から始まる。
関数binSort をbinSort (□)として呼び出すと、戻り値の配列には未定義の要素は含まれておらず、値は昇順に並んでいる。
〔プログラム〕
1: 〇整数型の配列: binSort (整数型の配列: data)
2: 整数型: n ← data の要素数
3: 整数型の配列:bins ← {n個の未定義の値}
4: 整数型:i
5: for (i を 1 から n まで 1 ずつ増やす)
6: bins[data[i]] ← data[i]
7: endfor
8: return bins
解答:{2, 6, 3, 1, 4, 5}
解説
前提条件
data = {2, 6, 3, 1, 4, 5}
bins 配列は、要素番号が1から始まり、長さはdataに基づく6要素 の配列とする。
初期状態の bins 配列は未定義値 _ で初期化される。
初期状態:
bins = [_, _, _, _, _, _] // 配列インデックス 1~6
ループ処理の追跡
for (i を 1 から n まで 1 ずつ増やす)
bins[data[i]] ← data[i]
endfor
ループ1回目 (i = 1)
data[1] = 2
bins[2] ← data[1] = 2 により、bins 配列の インデックス2 に値 2 を格納。
bins = [_, 2, _, _, _, _]
ループ2回目 (i = 2)
data[2] = 6
bins[6] ← data[2] = 6 により、bins 配列の インデックス6 に値 6 を格納。
bins = [_, 2, _, _, _, 6]
ループ3回目 (i = 3)
data[3] = 3
bins[3] ← data[3] = 3 により、bins 配列の インデックス3 に値 3 を格納。
bins = [_, 2, 3, _, _, 6]
ループ4回目 (i = 4)
data[4] = 1
bins[1] ← data[4] = 1 により、bins 配列の インデックス1 に値 1 を格納。
bins = [1, 2, 3, _, _, 6]
ループ5回目 (i = 5)
data[5] = 4
bins[4] ← data[5] = 4 により、bins 配列の インデックス4 に値 4 を格納。
bins = [1, 2, 3, 4, _, 6]
ループ6回目 (i = 6)
data[6] = 5
bins[5] ← data[6] = 5 により、bins 配列の インデックス5 に値 5 を格納。
bins = [1, 2, 3, 4, 5, 6]
ループ終了後の結果
最終的に、bins 配列には以下のように昇順で値が格納される:
bins = [1, 2, 3, 4, 5, 6]
注意
この処理では、data 配列に同じ値が複数含まれる場合や範囲外の値が含まれる場合は正常に動作しない(例外処理は書かれていないため)。よって、重複する値がある選択肢は、不正解となる。
・Java でコーディング
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class BinSortExample {
public static void main(String[] args) {
int[] data1 = {2, 6, 3, 1, 4, 5}; // data1 を指定された値に修正
try {
System.out.println("Result for data1: " + Arrays.toString(binSort(data1)));
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
public static int[] binSort(int[] data) {
int maxValue = Arrays.stream(data).max().orElse(0);
int[] bins = new int[maxValue + 1];
Arrays.fill(bins, -1);
Set<Integer> seen = new HashSet<>();
for (int value : data) {
if (seen.contains(value)) {
throw new IllegalArgumentException("Error: Duplicate value found: " + value);
}
bins[value] = value;
seen.add(value);
}
return Arrays.stream(bins).filter(val -> val != -1).toArray();
}
}
・Pythonでコーディング
def bin_sort(data):
max_value = max(data)
bins = [-1] * (max_value + 1)
seen = set()
for value in data:
if value in seen:
raise ValueError(f"Error: Duplicate value found: {value}")
bins[value] = value
seen.add(value)
return [value for value in bins if value != -1]
# テスト
data1 = [2, 6, 3, 1, 4, 5] # data1 を指定された値に修正
try:
print("Result for data1:", bin_sort(data1))
except ValueError as e:
print(e)
出力結果
data1 = {2, 6, 3, 1, 4, 5} の場合、出力は [1, 2, 3, 4, 5, 6] になる。
以上。