JavaScriptで目標の平均値を達成するために必要な数値を求める方法
この記事では、JavaScriptを使って「配列にあと1つ数値を追加したときに、その平均値が指定した目標値と一致するような数」を求める方法を解説します。
問題の概要
数値の配列と、単一の数値(目標平均値)を受け取るJavaScript関数を作成します。
この関数は、その数値を配列に追加することで、配列全体の平均が第2引数で指定された値と等しくなるように、追加すべき数値を返す必要があります。
解決の考え方
平均値の定義に立ち返ると、答えは簡単な算術で導き出せます。
- まず現在の配列の合計値を求めます。
- 新しい要素を1つ追加すると、配列の長さは「元の長さ + 1」になります。
- 目標平均 × 新しい長さ = 必要な合計値 となるため、「必要な合計値 − 現在の合計値」が追加すべき数値です。
サンプルコード
以下が実際のコード例です。
const arr = [4, 20, 25, 17, 9, 11, 15];
const target = 25;
function findNumber(arr, target) {
let sum = arr.reduce((a, b) => a + b, 0);
let avg = sum / arr.length;
let next = Math.ceil((target * (arr.length + 1)) - sum);
if (next <= 0) {
throw new Error('すでに平均が目標値以上です');
}
return next;
}
console.log(findNumber(arr, target));
実行結果
99
コードの解説
- sum の計算:
reduce()を使って配列内の全要素の合計(この例では101)を求めています。 - avg の計算: 合計を配列の長さで割り、現在の平均値を求めています。これはデバッグや検証用として保持しています。
- next の計算: 目標平均25に到達するには、8個の要素(7個+新規1個)の合計が200である必要があります。200 − 101 = 99 が追加すべき数値です。
Math.ceil()を使うことで、小数点以下を切り上げて整数を返します。 - エラーハンドリング: 計算結果が0以下の場合、すでに平均が目標値に達しているため、エラーをスローして異常系に対応しています。
このように、平均値の性質を利用すれば、配列に1つの要素を加えるだけで目標平均を実現できる数値を簡単に算出できます。データ補正やテストデータ生成など、さまざまな場面で応用可能なテクニックです。
-
JavaScriptで配列内の最長フィボナッチ部分列を見つける方法
フィボナッチ数列とは 数列 X_1, X_2, ..., X_n がフィボナッチ数列であるとは、以下の条件を満たすことを指します。 n >= 3 である すべての i + 2 <= n に対して、X_i + X_{i+1} = X_{i+2} が成り立つ つまり、隣り合う2項の和が常に次の項になる数列のことです。 問題の概要 数値の配列 arr を第1引数(唯一の引数)として受け取り、配列 arr 内に存在する最長のフィボナッチ部分列の長さを見つけて返すJavaScript関数を作成する必要があります。 ここでいう「部分列」とは、元の配列 arr から任意の個数の要素(0個で
-
JavaScriptで配列を分割したときの平均値の合計の最大値を求める方法
問題の概要 数値の配列 arr を第一引数に、数値 num(num は arr の長さ以下)を第二引数に受け取るJavaScript関数を作成します。 この関数の目的は、配列 arr を最大 num 個の「隣接する空でないグループ」に分割することです。分割の際、どの要素も取り残してはいけません。 そして、考えられるすべての分割方法の中から、各グループの平均値の合計が最大になるような分割を選び出し、その最大の合計値を返します。 例として、次の入力を考えてみましょう。 入力 const arr = [10, 2, 3, 4, 10]; const num = 3; 出力 const output