JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで5つの整数のうち4つを合計して求める最小値と最大値の計算方法


正の整数が5つ格納された配列が与えられます。このとき、5つの整数のうちちょうど4つを選んで合計したときに得られる値の中から、最小値最大値を求めましょう。

結果は、最小値と最大値をスペースで区切った1行の整数として出力します。

なお、入力となる配列は必ずしもソートされていない点に注意が必要です。

問題の例

たとえば、次のような配列を考えてみます。

const arr = [1, 3, 5, 7, 9]

この場合、最小の合計値は次のようになります。

1 + 3 + 5 + 7 = 16

一方、最大の合計値は次のとおりです。

3 + 5 + 7 + 9 = 24

したがって、関数の戻り値は以下のようになります。

[16, 24]

実装の考え方

基本的なアプローチはシンプルです。

  • 配列を昇順にソートする
  • 最小値:先頭から4つの要素(末尾の要素を除く)を合計する
  • 最大値:末尾から4つの要素(先頭の要素を除く)を合計する

この考え方をもとに実装したコードが次のとおりです。

実装例

const arr = [1, 3, 5, 7, 9];

const findMinMaxSum = (arr = []) => {
  // 数値として正しくソートするため比較関数を指定
  const numbers = arr.slice().sort((a, b) => a - b);

  let minScore = 0;
  let maxScore = 0;

  // 最小値:先頭から4つ(末尾を除く)を合計
  for (let i = 0; i < numbers.length - 1; i++) {
    minScore += numbers[i];
  }

  // 最大値:2番目から末尾まで(先頭を除く)を合計
  for (let j = 1; j < numbers.length; j++) {
    maxScore += numbers[j];
  }

  return [minScore, maxScore];
};

console.log(findMinMaxSum(arr));

※ 引数なしの sort() は文字列比較を行うため、2桁以上の数値が含まれると誤った順序になることがあります。(a, b) => a - b のように比較関数を渡すことで、数値として正確にソートできます。

出力結果

コンソールには次のように表示されます。

[16, 24]

別のアプローチ:合計値からの差分で求める

より効率的な方法もあります。全要素の合計値をあらかじめ計算しておき、そこから最大の要素を引けば最小の合計最小の要素を引けば最大の合計がそれぞれ求まります。

const findMinMaxSum = (arr = []) => {
  const sorted = [...arr].sort((a, b) => a - b);
  const total = arr.reduce((sum, n) => sum + n, 0);
  return [
    total - sorted[arr.length - 1], // 全体から最大値を引くと最小の合計
    total - sorted[0]               // 全体から最小値を引くと最大の合計
  ];
};

console.log(findMinMaxSum([1, 3, 5, 7, 9])); // [16, 24]

この方法では合計値を一度だけ計算すればよいため、処理の意図もより明確になります。

まとめ

5つの整数から4つを選んで合計するとき、最小値と最大値は「ソート後に先頭4つを足すか、末尾4つを足すか」だけで簡単に求められます。数値のソート時には比較関数の指定を忘れないようにしましょう。

  1. 単一のMySQLクエリで最大値と最小値を同時に取得する方法

    MySQLでは、集計関数である MIN() と MAX() を1つのSELECT文に組み合わせることで、単一のクエリだけでカラムの最小値と最大値を同時に取得できます。この記事では、実際にテーブルを作成し、データを挿入してから、その取得方法を順を追って解説します。 サンプルテーブルの作成 まずは、2つのINT型カラムを持つテーブルを作成します。 mysql> create table DemoTable ( FirstValue int, SecondValue int ); Query OK, 0 rows affected (0.66 sec) テストデータの挿入

  2. 【MySQL】単一のクエリで最小値と最大値を同時に取得する方法

    MySQLでは、UNIONを活用することで、たった1つのクエリでテーブル内の最小値と最大値を同時に取得できます。MIN()関数とMAX()関数をサブクエリとして組み合わせるのがポイントです。ここでは、テーブルの作成からデータの挿入、実際のクエリ実行まで順番に解説します。サンプルテーブルを作成するまず、CREATE TABLE文でテーブルを作成します。mysql> create table DemoTable ( Price int ); Query OK, 0 rows affected (0.57 sec)データを挿入する続いて、INSERT文でいくつかのレコードを追加します。