JavaScriptで配列から三角形を作れる組み合わせの数を数える方法
問題
数値の配列 arr を第一引数(唯一の引数)として受け取る JavaScript 関数を作成します。
この関数の目的は、配列から選んだ3つの数値を三角形の3辺としたときに、実際に三角形が成立する組み合わせ(三つ組)の総数を数えることです。
たとえば、関数への入力が次のようだった場合:
const arr = [2, 2, 3, 4];
期待される出力は次のとおりです。
const output = 3;
出力の解説
有効な組み合わせは以下の3通りです。
2,3,4(1つ目の2を使用) 2,3,4(2つ目の2を使用) 2,2,3
三角形の成立条件
3つの辺 a、b、c(a ≤ b ≤ c)が三角形を構成するためには、最も長い辺が他の2辺の合計より短くなければなりません。つまり「a + b > c」という不等式を満たす必要があります。この性質を利用することで、効率的に判定を行えます。
サンプルコード
以下がその実装例です。
const arr = [2, 2, 3, 4];
const countTriangle = (arr = []) => {
arr.sort((a, b) => a - b)
let k = 2
let count = 0
for (let i = 0; i < arr.length - 2; i++) {
for (let j = i + 1; j < arr.length - 1; j++) {
k = j + 1
while (arr[k] < arr[i] + arr[j]) {
k += 1
}
count += k - j - 1
}
}
return count
};
console.log(countTriangle(arr));
コードの解説
まず配列を昇順にソートし、最小の2辺 i と j を固定します。続いて内側の while ループで、arr[i] + arr[j] より小さい要素の範囲を求めます。ソート済みであるため、この範囲に含まれるすべての要素は第3辺として三角形を成立させられます。k - j - 1 がその組み合わせの数に相当し、これを累積していく仕組みです。全探索(O(n³))に比べ、この方法では処理量を大幅に抑えられます。
出力結果
コンソールには次のように表示されます。
3
-
JavaScriptで0からnまで数えるときに「9」が出現する回数を数える方法
問題 数値 n を引数として受け取るJavaScript関数を作成します。この関数は、0からnまで順番に数えていく過程で、数字の「9」が何回登場するかを数え、その合計回数を返す必要があります。 解決のアプローチ この問題は、次の手順でシンプルに解決できます。 0からnまでの各数値を文字列に変換する 変換した文字列の中に「9」が何文字含まれているかを調べる すべての数値分のカウントを合計して返す 文字列内の特定の文字を数えるには、split() で1文字ずつ分解し、reduce() を使って一致する文字をカウントする方法が有効です。 コード例 以下が実際のコードです。 const num
-
JavaScriptで配列から作れる等差数列(AP)の個数を数える方法
等差数列(AP)とは 等差数列(Arithmetic Progression:AP)とは、隣り合う2つの数の差が常に一定の値になる数列のことです。この一定の差は「公差」と呼ばれます。 例えば、1, 2, 3, 4, 5, 6… という数列は、公差が1(2 − 1 = 1)の等差数列です。 問題 ここでは、整数の配列 arr を唯一の引数として受け取るJavaScript関数を作成します。 関数の役割は、その配列の中から作成可能な「サイズ3の等差数列」の個数を返すことです。各等差数列において、要素間の差はすべて同じでなければなりません。なお、入力配列は昇順にソートされていることが保証されていま