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

Pythonで各行を反転しても行列が変わらないかどうかを判定する方法

問題の概要

正方行列が与えられたとき、各行を反転(リバース)した後も、行列全体が元のまま変わらないかどうかを判定するプログラムをPythonで作成してみましょう。

言い換えると、この問題は「すべての行が回文(左右対称)になっているか」を確認する問題です。ある行を反転しても元の並びと同じになるなら、その行は回文であると言えます。

たとえば、次のような行列が入力された場合を考えてみます。

686
282
333

この場合、出力は True になります。どの行も反転しても元の並びとまったく同じになるためです。

解法のアプローチ

この問題は、両ポインタ(two pointers)テクニックを使うことでシンプルかつ効率的に解くことができます。手順は以下の通りです。

  • n := 行列の行数とする
  • i を 0 から n - 1 まで繰り返す
    • left := 0、right := n - 1 と初期化する
    • left <= right の間、以下を繰り返す
      • matrix[i][left] と matrix[i][right] が等しくない場合は False を返す
      • left を +1、right を -1 して中央に向かって進める
  • すべての行で対称性が確認できたら True を返す

つまり、各行の左端と右端から順に要素を比較していき、対応する位置の値がひとつでも異なれば、その行は反転すると変化してしまうため False を返します。

Pythonでの実装例

それでは、実際のコードを見てみましょう。

def solve(matrix):
    n = len(matrix)
    for i in range(n):
        left = 0
        right = n - 1
        while left <= right:
            if matrix[i][left] != matrix[i][right]:
                return False
            left += 1
            right -= 1
    return True

matrix = [
        [6,8,6],
        [2,8,2],
        [3,3,3]]
print(solve(matrix))

入力

[
    [6,8,6],
    [2,8,2],
    [3,3,3]]

出力

True

計算量について

このアルゴリズムの時間計算量は O(n²) です。n 行それぞれに対して、最大で n/2 回の比較を行うためです。また、追加のデータ構造を使用しないため、空間計算量は O(1) となり、メモリ面でも非常に効率的です。

  1. Pythonで行列を転置する4つの方法を徹底解説!コード例付き

    行列の転置とは? 行列の転置(transpose)とは、行列の列と行を入れ替える操作のことです。転置を行うと、元の行列の列が行になり、行が列になります。 具体例を使って理解しましょう。次のような元の行列「x」があるとします。 x = [[1,2],[3,4],[5,6]] この行列「x」には2つの列があり、1つ目の列には 1, 3, 5、2つ目の列には 2, 4, 6 が含まれています。 この行列を転置すると、列が行に入れ替わります。転置後の行列は次のようになります。 x1 = [[1, 3, 5],[2, 4, 6]] このように、転置後の新しい行列「x1」は、元の行列とは値の配置が異なる形

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

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