CodeIQ MAGAZINECodeIQ MAGAZINE

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

2017.07.13 Category:CodeIQ問題解説・リーダーボード Tag:

  • 2
  • このエントリーをはてなブックマークに追加
entry

息抜き時間でできる、簡単なプログラム。

あなたは見事、プログラムを書けましたか? というわけで、出題者の柳井さんによる解答と解説をどうぞ!
by CodeIQ運営事務局

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

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

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

問題

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

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

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

// 入力例
1
23
8
// 出力例
10.7
8.0

答え

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

まずは平均値です。

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

次は中央値です。

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

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

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

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

入力1

出力1

入力2

出力2

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

// 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<Integer> 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運営事務局より

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

  • 2
  • このエントリーをはてなブックマークに追加

■関連記事

【コードミステリ】数字に隠されたメッセージ【言語不問】解答と解説... 【コードミステリ】数字に隠されたメッセージ【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 喜屋武ちあきさんによるCodeIQ MAGAZINEでのブックレビューに合わせて、『顔貌売人』(文藝春秋)とのコラボ問題として出題されたものです。 それでは以下、問題とその解...
数学の問題をプログラミングで解こう!「ディバイド・アウト」問題解説... 問題のおさらい 自然数 n と素数 p に対し、n の階乗(n!)を p でこれ以上割り切れなくなるまで繰り返し割り、その商をさらに p で割ったときの余りを F(n, p) と定義します。 例えば F(12, 5)=4 です。 12!(=479001600)は 5 で最大 2 回割ることができ...
【息抜き】ファイル名を作ろう【言語不問】解答と解説... 【息抜き】ファイル名を作ろう【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 ファイルをディレクトリ内に作成する際、同じ名前のファイルがあると、末尾に数字を付けるなどして同じ名前にならないようにします。 こうし...
【夏のミステリー】殺人現場のコード 解答と解説... 【夏のミステリー】殺人現場のコード 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 殺人現場にプログラマが倒れていて、途中までプログラムが書かれている。 「続きを書いて欲しい」 これはダイイングメッセージなのか? どう...
数学の問題をプログラミングで解こう!「キャンディ・アンド・チョコレート」問題解説... 問題のおさらい n 個のキャンディをグループに分けます。 グループの最大のキャンディの個数が k 個となるような分け方の数を F(n, k) と定義します。 例えば、F(8, 3)=5 です。このときの分け方を以下に示します。 なお個々のキャンディを区別せずに扱う点に注意してください。 同...
【夏のミステリー】時間制限の密室 解答と解説... 【夏のミステリー】時間制限の密室 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 (なんやかんやあって)命からがら逃げてきた、あなた。 しかし逃げ込んだ部屋にあなたが入った途端、自動でドアはロックされ、しかも10分後にはガ...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ