2次元配列の一般的なパターン
CoddyのJavaScriptジャーニー「論理とフロー」セクションの一部 — レッスン 13/65。
2次元配列を扱う際、特定のパターンが頻繁に現れます。これらのパターンを認識することで、より効率的に問題を解決できるようになります。以下に、いくつかの一般的なパターンを紹介します:
対角線走査
行インデックスと列インデックスが等しい要素(matrix[i][i])にアクセスすることで、主対角線を取得できます。逆対角線(アンチダイアゴナル)の場合、行インデックスと列インデックスの合計は配列のサイズから1を引いた値に等しくなります(matrix[i][size - 1 - i])。
例えば:
1 2 3
4 5 6
7 8 9主対角線 (matrix[i][i]) を走査します:1, 5, 9
副対角線 (matrix[i][size - 1 - i]) を走査します:3, 5, 7
境界の走査
境界要素を走査するには、一方のインデックスを固定(0 または size - 1)したまま、もう一方を反復処理します。
上の境界線にアクセスするには、行インデックスを0に固定して列を反復処理します。
例えば:
1 2 3 4
5 6 7 8
9 10 11 12境界要素:1, 2, 3, 4, 8, 12, 11, 10, 9, 5(6と7を除くすべて)
チャレンジ
簡単printPatterns という名前の関数を作成してください。この関数は整数の正方2次元配列(matrix)を引数として受け取り、以下のパターンを出力します:
- 主対角線 (Main Diagonal): 行インデックスと列インデックスが等しいすべての要素を出力します。
- 副対角線 (Anti-Diagonal): 行インデックスと列インデックスの合計が行列のサイズから1を引いた値に等しいすべての要素を出力します。
- 境界 (Borders): 行列の上端、下端、左端、右端の境界要素を出力します。
出力は以下のようになります:
Main Diagonal: 1 6 11 16
Anti-Diagonal: 4 7 10 13
Top Border: 1 2 3 4
Bottom Border: 13 14 15 16
Left Border: 1 5 9 13
Right Border: 4 8 12 16チートシート
一般的な2次元配列の走査パターン:
対角線走査
主対角線:matrix[i][i](行インデックスと列インデックスが等しい)
逆対角線:matrix[i][size - 1 - i](行インデックスと列インデックスの合計が size - 1 に等しい)
1 2 3
4 5 6
7 8 9主対角線:1, 5, 9
逆対角線:3, 5, 7
境界走査
一方のインデックスを固定(0 または size - 1)したまま、もう一方を反復処理します:
- 上端の境界:行インデックス = 0、列を反復処理
- 下端の境界:行インデックス = size - 1、列を反復処理
- 左端の境界:列インデックス = 0、行を反復処理
- 右端の境界:列インデックス = size - 1、行を反復処理
自分で試してみよう
function printPatterns(matrix) {
let mainDiagonal = []
// TODO: 実装する
console.log("Main Diagonal:", mainDiagonal.join(" "));
let antiDiagonal = [];
// TODO: 実装する
console.log("Anti-Diagonal:", antiDiagonal.join(" "));
let topBorder = [];
// TODO: 実装する
console.log("Top Border:", topBorder.join(" "));
let bottomBorder = [];
// TODO: 実装する
console.log("Bottom Border:", bottomBorder.join(" "));
let leftBorder = [];
// TODO: 実装する
console.log("Left Border:", leftBorder.join(" "));
let rightBorder = [];
// TODO: 実装する
console.log("Right Border:", rightBorder.join(" "));
}
// 関数の外には何も書かないでくださいこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。