Menu
Coddy logo textTech

2次元配列の頻出パターン

CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 13/56。

2次元配列の操作の中には、非常に頻繁に登場するため、名前で覚えておく価値があるものがいくつかあります。

すべてのセルの合計を求める: グリッドを1次元配列に平坦化し、sumを呼び出します:

grid = [[1, 2], [3, 4]]
puts grid.flatten.sum  # 10

主対角線: 行のインデックスと列のインデックスが等しいセル (matrix[i][i]):

matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

(0...matrix.length).each do |i|
  puts matrix[i][i]
end
# 1, 5, 9

転置 (Transpose): Rubyにはこれが組み込まれています。行が列になり、その逆も同様です:

matrix.transpose
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

これらを名前で知っておくと、同じネストされたループを書き直す手間が省けます。

challenge icon

チャレンジ

簡単

正方形の matrix (n × n) が与えられます。理論のパターンから導き出される3つの行を出力してください:

  1. Anti-diagonal sum: <n>r + c == matrix.length - 1 となるセルの合計。
  2. Column sums: [...]、各列の合計。ヒント:最初に転置(transpose)し、次に各行をその合計にマッピング(map)し、最後に inspect します。
  3. Symmetric: true または false:行列はその転置行列と等しいですか?

デフォルトの行列の場合、出力は以下のようになります:

Anti-diagonal sum: 15
Column sums: [12, 15, 18]
Symmetric: false

チートシート

Rubyにおける一般的な2次元配列の操作:

すべてのセルの合計 — flattenしてからsumを実行します:

grid.flatten.sum

主対角線 — 行のインデックスと列のインデックスが等しいセル (matrix[i][i]):

(0...matrix.length).each { |i| puts matrix[i][i] }
# i == 0: matrix[0][0], i == 1: matrix[1][1], ...

逆対角線r + c == matrix.length - 1 となるセル:

(0...matrix.length).each { |i| puts matrix[i][matrix.length - 1 - i] }

転置 (Transpose) — 行を列に入れ替えます:

matrix.transpose
# [[1,4,7],[2,5,8],[3,6,9]]

列の合計 — 最初に転置し、各行(元の列)の合計を算出します:

matrix.transpose.map(&:sum)  # [col0_sum, col1_sum, ...]

対称性のチェック — 行列とその転置行列を比較します:

matrix == matrix.transpose  # true or false

自分で試してみよう

matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

# TODO: 反対角線の和、転置による列の和、対称性のチェック
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン