ガジェット通信 GetNews

見たことのないものを見に行こう
「ジャスティス・リーグ」特集サイト

【息抜き】平均値と中央値【言語不問】解答と解説

DATE:
  • ガジェット通信 GetNewsを≫

【息抜き】平均値と中央値【言語不問】

本問題は、表題のテーマで、簡単なプログラムを書くものです。

それでは以下、問題とその解答を見ていきましょう。

問題

改行区切りの文字列の各行(最大行数30)は、半角数字のみの整数(最大桁数8)になっています。

この各行の平均値と中央値を求めて下さい。小数点以下は1桁まで出力するものとします(2桁目以降は四捨五入、小数点以下がない場合は0埋め)。最初の行が平均値、次の行が中央値を出力するものとします。

(参考:各プログラミング言語の標準入出力サンプル

// 入力例
1
23
8

// 出力例
10.7
8.0

答え

この問題は、以下の手順で処理を行なう必要があります。

まずは平均値です。
各行の数値をすべて足す。
合計値を、数値の個数で割る。
割った値を小数点以2桁目で四捨五入して、小数点1桁にする。
小数点以下がない場合は0埋めする。

次は中央値です。
各行の数値を配列にする。
配列をソートする。
配列の要素数が奇数の場合は真ん中の値を得る。
配列の要素数が偶数の場合は真ん中2つの平均値を得る。
得た値を小数点以2桁目で四捨五入して、小数点1桁にする。
小数点以下がない場合は0埋めする。

以下、問題の入力と出力です。

入力1は、平均を計算すると「951378.5555555555」となるので、小数点以下2位で四捨五入して「951378.6」にします。また、中央値は「86」となるので、小数点1位を0埋めして「86.0」にします。

入力2は、平均を計算すると「5671889.266666667」となるので、小数点以下2位で四捨五入して「5671889.3」にします。中央値は「4659」となるので、小数点1位を0埋めして「4659.0」にします。
入力1

43
3996
7926717
631415
1
96
86
9
44
出力1

951378.6
86.0

入力2

43
3996
7926717
631415
1
96
86
9
44
595
4
308848
11
12785
57667
386
41396
2802986
837216
2
565293
20095359
98785639
2273
5204
3
7072
4114
263252
37804166
出力2

5671889.3
4659.0

以下、解答例を示します。サンドボックスで実行してください。

// https://codeiq.jp/tools/sandbox/
// Java (7/8)

import java.util.*;
import java.text.NumberFormat;

class Main{
public static void main(String[] args) {
// 変数の初期化
Scanner cin = new Scanner(System.in);
List list = new ArrayList();
String line;
double sum = 0;
// 固定小数点表記
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setGroupingUsed(false);
nf.setMaximumFractionDigits(1);
nf.setMinimumFractionDigits(1);
// 平均値を計算、配列への格納
for(;cin.hasNext();) {
line = cin.nextLine();
int n = Integer.parseInt(line);
sum += n;
list.add(n);
}
double avrgN = Math.round(sum / list.size() * 10) / 10.0;
System.out.println(nf.format(avrgN));
// 中央値を計算
double median = 0;
int sz = list.size();
Collections.sort(list);
if (sz % 2 == 0) {
// 偶数
median = (list.get(sz / 2 – 1) + list.get(sz / 2)) / 2.0;
} else {
// 奇数
median = list.get(sz / 2);
}
System.out.println(nf.format(median));
}
}

// https://codeiq.jp/tools/sandbox/
// Node.js

process.stdin.resume();
process.stdin.setEncoding(‘utf8’);
process.stdin.on(‘data’, function (chunk) {
var lines = chunk.toString().split(‘n’);
lines = lines.map(function(x) {return x * 1});
// 固定小数点表記
var toFixed1 = function(n) {
var s = ” + Math.round(n * 10) / 10;
return s.indexOf(‘.’) === -1 ? s + ‘.0’ : s;
};
// 平均値を計算
var sum = 0;
lines.forEach(function(line) {sum += line});
var avrg = toFixed1(sum / lines.length);
console.log(avrg);
// 中央値を計算
lines.sort(function(a, b) {return a – b});
var median;
if (lines.length % 2 === 0) {
// 偶数
var center1 = lines.length / 2;
var center0 = center1 – 1;
var sum = lines[center0] + lines[center1];
median = toFixed1(sum / 2);
} else {
// 奇数
var center = Math.floor(lines.length / 2);
median = toFixed1(lines[center]);
}
console.log(median);
});

CodeIQ運営事務局より

柳井さん、ありがとうございました!
次回の柳井さんの問題にご期待ください!

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。