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
  • このエントリーをはてなブックマークに追加

■関連記事

【息抜き】右位置揃え【言語不問】解答と解説... 【息抜き】右位置揃え【言語不問】 本問題は、表題のテーマで、簡単なプログラムを書くものです。 それでは以下、問題とその解答を見ていきましょう。 問題 改行区切りの文字列の各行は、半角数字のみの整数(最大桁数32)になっています。 この各行の先頭に任意の数の半角のアンダーバー(_)を挿入して...
【謎解きプログラム】どんな配列が得られる?【フィルター,マップ】解答と解説... 【謎解きプログラム】どんな配列が得られる?【フィルター,マップ】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 ...
数学の問題をプログラミングで解こう!「タンジェント・フラクション」問題解説... 問題のおさらい α と β を、0 < α < β < π/2 を満たす実数とします。 α, β の組のうち、tan(α), tan(β), tan(α+β) がすべて単位分数(分母が自然数、分子が 1 の分数として書き表せる数)となるものを考えましょう。(α, β の単位はラジアンと見なします...
【謎解きプログラム】どう比較する?【ソート】解答と解説... 【謎解きプログラム】どう比較する?【ソート】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24時間以内に謎...
数学の問題をプログラミングで解こう!「ロンリー・ルーク」問題解説... 問題のおさらい 自然数 n, k に対し、縦横 n×n のマス目にチェスのルークの駒を k 個配置することを考えます。 このとき、自身から見て上下方向・左右方向のいずれにも他の駒が存在しないような駒を「はぐれルーク」と呼びます。 例えば以下は、(n, k)=(4, 5) のときの駒の配置例を示...
【謎解きプログラム】どんな数字になる?【整数のキャスト】解答と解説... 【謎解きプログラム】どんな数字になる?【整数のキャスト】 本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。 それでは以下、各問題とその解答を見ていきましょう。 問題のオープニング ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。 「24...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

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

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

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