Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで指定セルの行・列を除いたマトリックス内の全要素の合計を求める方法

2次元マトリックス(行列)と複数のセルインデックスが与えられたとき、それぞれのセルインデックスについて「その行と列に含まれる要素を除外した残りの全要素の合計」を計算する問題を考えてみましょう。

セルインデックスは (i, j) の形式で表されます。ここで i は行番号、j は列番号を意味します。つまり、各セルインデックス (i, j) ごとに、i 行目および j 列目に存在する要素をすべて取り除き、それ以外の要素の合計を求めることになります。

入力例

たとえば、次のような3×3のマトリックスが与えられたとします。

223
457
643

このとき、セルインデックスが [(0, 0), (1, 1), (0, 1)] である場合、出力は [19, 14, 20] となります。

出力結果の検証

  • (0, 0) の場合:0行目と0列目を除外 → 5 + 7 + 4 + 3 = 19
  • (1, 1) の場合:1行目と1列目を除外 → 2 + 3 + 6 + 3 = 14
  • (0, 1) の場合:0行目と1列目を除外 → 4 + 7 + 6 + 3 = 20

解法のアプローチ

この問題は、以下の手順で解くことができます。

  • n := インデックス配列(ind_arr)のサイズとする
  • ans := 結果を格納する新しいリストを作成する
  • i を 0 から n-1 まで繰り返す:
    • Sum := 0 で初期化する
    • row := ind_arr[i][0](対象の行番号)
    • col := ind_arr[i][1](対象の列番号)
    • j を 0 から mat の行数まで繰り返す:
      • k を 0 から mat の列数まで繰り返す:
        • j ≠ row かつ k ≠ col の場合のみ、Sum := Sum + mat[j][k]
    • ans の末尾に Sum を追加する
  • 最後に ans を返す

Pythonでの実装例

実際のコードを見てみましょう。

def show_sums(mat, ind_arr):
    n = len(ind_arr)
    ans = []
    for i in range(0, n):
        Sum = 0
        row = ind_arr[i][0]
        col = ind_arr[i][1]
        for j in range(0, len(mat)):
            for k in range(0, len(mat[0])):
                if j != row and k != col:
                    Sum += mat[j][k]
        ans.append(Sum)
    return ans

mat = [[2, 2, 3], [4, 5, 7], [6, 4, 3]]
ind_arr = [(0, 0), (1, 1), (0, 1)]
print(show_sums(mat, ind_arr))

入力

mat = [[2, 2, 3], [4, 5, 7], [6, 4, 3]]
ind_arr = [(0, 0), (1, 1), (0, 1)]

出力

[19, 14, 20]

計算量について

この実装では、クエリごとにマトリックス全体を走査するため、マトリックスのサイズを m×n、クエリ数を q とすると、時間計算量は O(q × m × n) になります。クエリ数やマトリックスサイズが大きい場合は、各行・各列の合計を事前に計算しておくことで、O(m + n) で1つの合計を導出できるようになり、処理を大幅に高速化できます。

  1. Pythonで二分木の全ノードの値の合計を求めるプログラム

    二分木(バイナリツリー)にいくつかの値が格納されている場合、木に含まれるすべての値の合計を求めたいことがあります。例えば、次のような二分木が入力として与えられたとします。この場合、出力は 14 になります(2 + 4 + 3 + 5 = 14)。解決のアプローチこの問題を解くには、再帰を使って各ノードを順番に訪問し、値を足し合わせていきます。具体的な手順は以下の通りです。関数 recurse() を定義します。引数としてノードを受け取ります。変数 val に現在のノードの値を代入します。ノードの左の子が存在する場合は、val に左部分木の再帰結果を加算します。ノードの右の子が存在する場合は、v

  2. Pythonで行・列ごとに並べられた行列の全要素をソート順に出力する方法

    行列(マトリックス)のすべての要素をソートされた順序で取得したいケースはよくあります。しかし、行列は行と列という2次元の形式で構成されているため、通常のソートアルゴリズムをそのまま適用することはできません。そこで、以下のようにユーザー定義関数を作成し、それを使って要素を並べ替えます。 ここで紹介するのはヒープソートを利用した手法です。まずheapq関数で配列をヒープ構造に変換(ヒープ化)し、続くSort関数で実際のソート処理を実行します。 コード例 def heapq(a, k, i):     greater = i