🌎

座標と二次元配列(行列)の基本操作

に公開

最近paizaラーニングを始めました。
https://paiza.jp/works

  • アルゴリズムの構築の仕方
  • メソッドの使い方

などが身に付くのでおすすめです。(無料でもある程度使えるようです)

自身は今のところプログラミングスキルチェックの問題ばかりやっています。

※問題の解答コード例が無かったりしますが、chatGPTに問題文をまるごとコピーして投げてやれば解答例のコードを教えてくれます。

上記の問題の中で、座標と二次元配列(行列)の操作が必要になったので、学んだことを記載しておきます。


<目次>

  1. 座標系の移動
  2. 二次元配列のfor文

1. 座標系の移動

問題文によっては文字列で移動すべき方向を指定されたりします。

例えば、F(前)、B(後)、L(左)、R(右)のように定義されており、

文字列で"B R F"と与えられた方向に座標を移動しないといけない場合

下記のように文字列と配列の組み合わせを定義して、それを足し合わせることで現在の座標を動かします。

F: [-1, 0],
B: [1, 0],
L: [0, -1],
R: [0, 1]

// 初期座標
let y = 0
let x = 0
const grid = [  
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 方向に合わせた配列を作成
const directions = {
F: [-1, 0],
B: [1, 0],
L: [0, -1],
R: [0, 1],
};

// 問題文の指示を入力
const s = "BRF"

for (let i = 0; i < s.length; i++) {
    const dir = s[i];
    const [dy, dx] = directions[dir];
    y += dy;
    x += dx;
    console.log(grid[y][x]);
}

// 結果
4 // grid[1][0]の数字
5 // grid[1][1]の数字
2 // grid[0][1]の数字

for文で文字列を順に取り出して、grid内の数字を順に取り出しています。

ちょっと説明が不十分かもしれませんが、、、雰囲気は分かってもらえると思います。


2. 二次元配列のfor文

二次元配列にfor文を二回重ねてやると、全ての数字に順にアクセスできます。

さらに、二次元配列のfor文を回す際にjとiを入れ替えると列方向の数字を取り出すことができます。(転置行列の作成)

const grid = [  
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

const newGrid = [];

for (let i = 0; i < 3; i++) {
    const temp = [];
    for (let j = 0; j < 3; j++) {
        temp.push(grid[j][i]); // ここでj,iの順番を入れ替える
    }
    newGrid.push(temp); // tempを1つの配列としてnewGridに追加
}

console.log(newGrid);

// 結果
[  
    [1, 4, 7],
    [2, 5, 8],
    [3, 6, 9]
];

ググるとこの操作も1行でできたりするみたいですが^^;

理解して身に付けるには上記のようなコードを作成してみるのは効果的ですね。


所感

行列の操作は今まであまり触れてなかったんですが、

paizaラーニングだとわんさか求められるので、嫌でも身に付いていきそうです。。。

トレーニングを続けて、さらに自由に扱えるようになりたいと思います。

GitHubで編集を提案

Discussion