新らしくなった基本情報 科目 B 20問バージョン アルゴリズムとプログラミング サンプル問題14をJavaにしてみました

2023 年 4 月からIPA (独立行政法人情報処理推進機構)の基本情報技術者試験の制度が変更されました。

ここでは、「基本情報技術者試験 科目 B のサンプル問題20問バージョン」の中から、アルゴリズムとプログラミングの問題を取り上げ、Javaのソースコードを示します。

新人エンジニア研修に参加されている皆様の参考になれば幸いです。

【Javaプログラム】

import java.util.Arrays;

public class Q14 {

    static double findRank(double[] sortedData, double p) {
        int i = (int) Math.ceil(p * (sortedData.length - 1));
        return sortedData[i];
    }

    static double[] summarize(double[] sortedData) {
        double[] rankData = new double[5];
        double[] p = { 0, 0.25, 0.5, 0.75, 1 };
        for (int i = 0; i < p.length; i++) {
            rankData[i] = findRank(sortedData, p[i]);
        }
        return rankData;
    }

    //以下はテスト
    public static void main(String[] args) {

        double[] data = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1 };
        double[] summary = summarize(data);

        System.out.println(Arrays.toString(summary));
    }
}

【結果】

[0.1, 0.4, 0.6, 0.8, 1.0]

【プログラムの解説】

このプログラムは、与えられた数列の中からパーセンタイルを計算するための関数 findRank() と、与えられた数列のパーセンタイルを計算する関数 summarize() を定義し、それらを使って与えられた数列のサマリー(0%、25%、50%、75%、100%パーセンタイル)を計算して出力するものです。

findRank() 関数は、ソート済みの数列とパーセンタイルを受け取り、パーセンタイルに対応する値を返します。具体的には、以下の手順で計算しています。

  1. パーセンタイル p に対応するインデックス i を計算します。i は、(p * (sortedData.length - 1)) の結果を小数点以下を切り上げたものとなります。
  2. sortedData[i] の値を返します。

summarize() 関数は、与えられた数列のパーセンタイルを計算するために、0%、25%、50%、75%、100%パーセンタイルに対応するパーセンタイル値を計算して返します。具体的には、以下の手順で計算しています。

  1. 長さが5の配列 rankData を用意します。
  2. パーセンタイル値が格納された配列 p に対して、findRank() 関数を呼び出し、対応するパーセンタイルに対応する値を rankData 配列に格納します。
  3. rankData 配列を返します。

main() メソッドでは、数列 { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1 } を定義し、summarize() 関数を呼び出してサマリーを計算し、配列 summary に格納しています。そして、Arrays.toString() メソッドを使って summary 配列を文字列に変換して出力しています。

このプログラムは、パーセンタイルの計算方法を理解する手助けになるでしょう。また、小数点以下を切り上げる方法や、配列の初期化方法についても学ぶことができます。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。