JavaScriptでエレベータが移動した階数の合計を求める方法
問題
ある時間帯において、建物のエレベータが停止した階数を要素として持つ配列を受け取り、その間にエレベータが移動した階数の合計を返すJavaScript関数を作成する必要があります。
解決のアプローチ
この問題は、配列内の隣り合う2つの階数の差の絶対値を順番に足し合わせることで解決できます。例えば、7階から1階へ移動すれば6階分、1階から7階へ戻ればさらに6階分とカウントしていきます。最終的に、これらの差をすべて合計した値が、エレベータがカバーした総階数となります。
コード例
以下がその実装コードです。
const arr = [7, 1, 7, 1];
const floorsCovered = (arr = []) => {
let res = 0;
for (let i = 0; i < arr.length; i++){
if (arr[i] > arr[i+1]){
res += arr[i] - arr[i+1];
};
if (arr[i] < arr[i+1]){
res += arr[i+1] - arr[i];
}
};
return res;
};
console.log(floorsCovered(arr));
出力結果
コンソールには次のように出力されます。
18
処理の流れの解説
入力配列 [7, 1, 7, 1] の場合、各移動の階数差は以下のように計算されます。
- 7階 → 1階:
|7 − 1| = 6 - 1階 → 7階:
|1 − 7| = 6 - 7階 → 1階:
|7 − 1| = 6
合計は 6 + 6 + 6 = 18 となり、関数は正しく18を返します。
なお、ループの最後では arr[i+1] が undefined になりますが、数値との大小比較はどちらも false を返すため、加算処理が行われず安全に動作します。より堅牢にしたい場合は、Math.abs(arr[i+1] - arr[i]) を使って条件分岐をまとめたり、ループ範囲を arr.length - 1 までに限定する方法も有効です。
-
JavaScriptで合計が0以上となる最長部分配列を見つけるアルゴリズム
問題の概要今回は、-1から1の範囲の整数のみを含む配列を受け取り、その中から合計が0以上になる最長の連続する部分配列(サブアレイ)の長さを返すJavaScript関数を作成します。一見単純な問題に見えますが、全ての組み合わせを総当たりで調べると計算量がO(n²)となり、配列が大きくなると非効率です。そこで本記事では、累積和(プレフィックスサム)の考え方を活用し、線形時間O(n)で解くスマートな手法を紹介します。解法のコードconst arr = [-1, -1, 0, 1, 1, -1, -1, -1]; const longestPositiveSum = (arr = []) =>
-
JavaScriptで括弧文字列のスコアを計算する方法
問題の概要バランスの取れた角括弧([ と ])のみで構成された文字列 str を引数として受け取り、そのスコアを計算して返すJavaScript関数を作成する必要があります。スコアの計算は、以下のルールに従います。[] のスコアは 12つのバランスの取れた括弧文字列 A と B を連結した AB のスコアは A + Bバランスの取れた括弧文字列 A を囲んだ [A] のスコアは 2 × A入出力例例えば、関数への入力が次の場合:入力const str = [][];出力const output = 2;この場合、[] が2つ並んでいるため、スコアは 1 + 1 = 2 となります。解決アプロー