JavaScriptで有効なワードスクエアを判定する方法を解説
ワードスクエアとは?
ワードスクエア(Word Square)とは、複数の単語を正方形のマス目状に並べ、横方向(行)にも縦方向(列)にも同じ単語が読めるように配置したものです。
例えば、次のような配置は有効なワードスクエアの一例です。
HEART
EMBER
ABUSE
RESIN
TREND
1行目を横に読むと「HEART」、1列目を縦に読んでも「HEART」となり、同様にすべての行と列が対応しています。
作成する関数の仕様
今回は、単語の配列を引数として受け取るJavaScript関数を実装します。入力された配列が有効なワードスクエアを構成している場合は true を、そうでない場合は false を返します。
たとえば、次のような配列が入力された場合を考えてみましょう。
const arr = [
"abcd",
"bnrt",
"crmy",
"dtye"
];
各行を縦に読み上げると、同じ単語が現れるため、出力は次のようになります。
const output = true;
コード例
実際の実装コードは以下のとおりです。
const findValidSquares = (arr = []) => {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j++) {
// 行と列の長さが揃っていない場合は無効
if (j >= arr.length || i >= arr[j].length) {
return false;
}
// 対称位置の文字が一致しない場合は無効
if (arr[i][j] !== arr[j][i]) {
return false;
}
}
}
return true;
};
const arr = [
"abcd",
"bnrt",
"crm",
"dt"
];
console.log(findValidSquares(arr));この例では、各行の長さが異なる(4文字・4文字・3文字・2文字)不完全な形の配列を渡しても、埋まっている部分の対称性が保たれていれば true と判定されます。
アルゴリズムのポイント
- 対称性の確認: グリッド上の位置
[i][j]の文字と[j][i]の文字が常に一致していれば、その配列はワードスクエアとなります。 - 範囲外アクセスへの対策: 各行の長さが異なる場合もあるため、比較前に
j >= arr.lengthやi >= arr[j].lengthのチェックを行い、安全に処理します。 - 計算量: すべてのマスを一度ずつ確認するため、時間計算量は O(N²) です。
実行結果
コンソールには次のように出力されます。
true
-
【JavaScript】配列の中で左右の合計が等しくなる中央インデックス(ピボットインデックス)を見つける方法
問題数値の配列 arr が与えられたとき、「あるインデックスより左側にあるすべての要素の合計」と「そのインデックスより右側にあるすべての要素の合計」が等しくなる位置(中央インデックス/ピボットインデックス)を求める JavaScript 関数を作成します。該当するインデックスが複数存在する場合は、最初に見つかったものを返し、存在しない場合は -1 を返すのが一般的です。たとえば、次のような入力を考えます。入力const arr = [1, 7, 3, 6, 5, 6];出力const output = 3;出力の解説インデックス 3 の要素は nums[3] = 6 です。この要素の左側にある
-
JavaScriptで最長のペアチェーンを見つける方法
問題数値ペア(組)の配列 arr を唯一の引数として受け取り、形成可能な最長チェーンの長さを返す JavaScript 関数を作成します。各ペアにおいて、最初の数値は必ず 2 番目の数値より小さいものとします。ここで、ペア (c, d) が別のペア (a, b) の後に続けられるのは、b < c が成り立つ場合に限られると定義します。このルールに従ってペアの連鎖(チェーン)を形成することができ、本関数はその中で最も長いチェーンの長さを求める必要があります。入力例const arr = [ [1, 2], [2, 3], [3, 4] ];出