Pythonで指定セルの行・列を除いたマトリックス内の全要素の合計を求める方法
2次元マトリックス(行列)と複数のセルインデックスが与えられたとき、それぞれのセルインデックスについて「その行と列に含まれる要素を除外した残りの全要素の合計」を計算する問題を考えてみましょう。
セルインデックスは (i, j) の形式で表されます。ここで i は行番号、j は列番号を意味します。つまり、各セルインデックス (i, j) ごとに、i 行目および j 列目に存在する要素をすべて取り除き、それ以外の要素の合計を求めることになります。
入力例
たとえば、次のような3×3のマトリックスが与えられたとします。
| 2 | 2 | 3 |
| 4 | 5 | 7 |
| 6 | 4 | 3 |
このとき、セルインデックスが [(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]
- k を 0 から mat の列数まで繰り返す:
- 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つの合計を導出できるようになり、処理を大幅に高速化できます。
-
Pythonで二分木の全ノードの値の合計を求めるプログラム
二分木(バイナリツリー)にいくつかの値が格納されている場合、木に含まれるすべての値の合計を求めたいことがあります。例えば、次のような二分木が入力として与えられたとします。この場合、出力は 14 になります(2 + 4 + 3 + 5 = 14)。解決のアプローチこの問題を解くには、再帰を使って各ノードを順番に訪問し、値を足し合わせていきます。具体的な手順は以下の通りです。関数 recurse() を定義します。引数としてノードを受け取ります。変数 val に現在のノードの値を代入します。ノードの左の子が存在する場合は、val に左部分木の再帰結果を加算します。ノードの右の子が存在する場合は、v
-
Pythonで行・列ごとに並べられた行列の全要素をソート順に出力する方法
行列(マトリックス)のすべての要素をソートされた順序で取得したいケースはよくあります。しかし、行列は行と列という2次元の形式で構成されているため、通常のソートアルゴリズムをそのまま適用することはできません。そこで、以下のようにユーザー定義関数を作成し、それを使って要素を並べ替えます。 ここで紹介するのはヒープソートを利用した手法です。まずheapq関数で配列をヒープ構造に変換(ヒープ化)し、続くSort関数で実際のソート処理を実行します。 コード例 def heapq(a, k, i): greater = i