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

Pythonで行列のi行目とi列目の合計が一致するかどうかを判定する方法

問題概要

2次元の行列(マトリックス)が与えられたとき、「i番目の行の合計」と「i番目の列の合計」が一致するかどうかを確認する問題です。

例えば、次のような行列が入力として与えられたとします。

2345
10642
1467
1567

この場合の出力は True になります。なぜなら、1行目の合計は (2 + 3 + 4 + 5) = 14、1列目の合計は (2 + 10 + 1 + 1) = 14 となり、両者が一致するからです。

解決のための手順

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

  1. 行列の行数(row)と列数(col)を取得します。
  2. 各行 i について、行の合計(total_row)と列の合計(total_col)を 0 で初期化します。
  3. 内側のループで j を 0 から col-1 まで回しながら、total_row には mat[i][j](行の要素)を加算し、total_col には mat[j][i](列の要素)を加算します。
  4. total_row と total_col が一致した時点で True を返します。
  5. すべての行を調べても一致するペアが見つからなければ False を返します。

ポイントは、二重ループの中で行と列の合計を同時に計算できることです。これにより、計算量を O(n²) に抑えながら効率的に判定できます。

実装コード

def solve(mat):
    row = len(mat)
    col = len(mat[0])
    total_row = 0
    total_col = 0
    for i in range(row):
        total_row = 0
        total_col = 0
        for j in range(col):
            total_row += mat[i][j]
            total_col += mat[j][i]

        if total_row == total_col:
            return True

    return False

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

print(solve(matrix))

実行結果の例

入力

[
[1,2,3,4],
[9,5,3,1],
[0,3,5,6],
[0,4,5,6]
]

この場合、1行目の合計は (1 + 2 + 3 + 4) = 10、1列目の合計は (1 + 9 + 0 + 0) = 10 となり、一致します。

出力

True

まとめ

このアルゴリズムでは、外側のループで対象となる行・列のインデックス i を決め、内側のループでその行と列の要素を順番に足し合わせています。一致する組み合わせが1つでも見つかれば即座に True を返すため、無駄な計算を省けるのが特徴です。正方行列だけでなく、行数と列数が異なる行列にも対応できる汎用的な実装になっています。

  1. Pythonで2つの二分木が完全に同じかどうかを判定するプログラム(構造と値の比較)

    2つの二分木が与えられたとき、それらが構造と値の両方の観点で完全に一致しているかどうかを確認します。このような木のペアは「双子の木(twin trees)」と呼ばれることがあります。 たとえば、次のような入力があったとします。 この場合、最初のペアに対する出力は True になります。一方、2番目と3番目のペアは、それぞれ「値が異なる」ケースと「構造が異なる」ケースに該当するため、出力は False になります。 解決のアプローチ この問題は、再帰的な手法を用いて解くことができます。具体的には、以下の手順に従います。 solve() メソッドを定義し、2つのルートノードを受け取るようにしま

  2. 【Python入門】2つの行列が同一かどうかを判定するプログラムの書き方

    この記事では、与えられた2つの行列(マトリックス)が同一であるかどうかを判定するPythonプログラムを紹介します。2つの行列が同一であるためには、次の条件を満たす必要があります。 両行列の行数・列数(次数)が一致していること 対応するすべての要素が等しいこと これらの条件を1つでも満たさない場合、2つの行列は同一とはみなされません。 アルゴリズム 判定の手順は以下の通りです。計算量は O(n²)(n×n行列の場合)となります。 ステップ1: 2つの行列を作成する。 ステップ2: 1つ目の行列と2つ目の行列のすべての要素を走査し、 対応する要素同士を順番に比較する