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

【Python】行列内の0を含む行と列をすべて0に変換するアルゴリズム

問題概要

2次元の数値行列が与えられたとき、行列内にある0を含む行と列のすべての要素を0に置き換え、最終的な行列を返すプログラムを作成します。

例えば、入力行列の中で0が存在する行(0行目、2行目、3行目)は、最終的な行列ではすべて0になります。同様に、0が存在する列(0列目、1列目、2列目)もすべて0に変換されます。

解法のアプローチ

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

  1. 行数を n、列数を m とします。
  2. n × m のサイズの結果用行列 res を作成し、すべての要素を0で初期化します。
  3. 元の行列の転置行列 transpose を作成します。
  4. 各行 i について、matrix[i] に0が含まれていない場合、各列 j に対して transpose[j] にも0が含まれていないかを確認します。両方に0が存在しなければ、res[i][j] に元の値 matrix[i][j] を代入します。
  5. 最後に res を返します。

擬似コードで表すと次のようになります。

n := 行数, m := 列数
res := n x m のサイズの行列を作成し、0で埋める
transpose := 与えられた行列の転置行列
for each row i, do
    if 0 not in matrix[i], then
        for each column j in matrix, do
            if 0 not in transpose[j], then
                res[i, j] := matrix[i, j]
return res

Pythonでの実装例

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

class Solution:
    def solve(self, matrix):
        n, m = len(matrix), len(matrix[0])
        res = [[0 for __ in range(m)] for _ in range(n)]
        transpose = [list(row) for row in zip(*matrix)]

        for i in range(n):
            if 0 not in matrix[i]:
                for j in range(m):
                    if 0 not in transpose[j]:
                        res[i][j] = matrix[i][j]

        return res

ob = Solution()
matrix = [
    [6, 0, 0, 6, 9],
    [4, 9, 9, 4, 8],
    [0, 8, 3, 4, 2],
    [9, 0, 7, 8, 3],
    [5, 2, 9, 6, 8]
]
print(ob.solve(matrix))

入力

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

出力

[[0, 0, 0, 0, 0], [0, 0, 0, 4, 8], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 6, 8]]

コードのポイント

このアルゴリズムの鍵となるのは転置行列の活用です。zip(*matrix) を使って転置行列を作成することで、「列 j に0が含まれているか」という判定を、リストの in 演算子でシンプルに記述できるようになります。

計算量は O(n × m × (n + m)) となります。これは、各セル (i, j) ごとに行と列の走査が必要になるためです。もしパフォーマンスをさらに向上させたい場合は、事前に0を含む行番号と列番号をセット(set)に記録しておく方式に変更することで、計算量を O(n × m) まで削減できます。

  1. Pythonでバブルソートを実装する方法をわかりやすく解説

    この記事では、代表的なソートアルゴリズムの一つである「バブルソート(Bubble Sort)」をPythonで実装する方法について詳しく解説します。 下図は、このアルゴリズムがどのように動作するかを示したものです。 アルゴリズムの手順 先頭の要素(インデックス = 0)から開始し、現在の要素と配列内の次の要素を比較します。 現在の要素が次の要素より大きい場合、両者を入れ替えます。 現在の要素が次の要素より小さい場合は、そのまま次の要素へ移動します。 この手順を、配列全体がソートされるまで繰り返します。 それでは、実際の実装を見てみましょう。 サンプルコード def bubbleSort(

  2. 【Python入門】線形探索(リニアサーチ)の仕組みと実装方法

    本記事では、最も基本的な探索アルゴリズムである「線形探索(リニアサーチ)」の仕組みと、Python 3.xでの実装方法について詳しく解説します。 線形探索とは 線形探索は、配列(リスト)の先頭から順番に要素を一つずつ調べ、目的の値と一致するかどうかを確認していくシンプルな探索手法です。データがソートされていなくても利用できるため、小規模なデータや整列されていないデータを扱う際に手軽で便利です。 アルゴリズムの手順 1. 配列 arr[] の左端(先頭)の要素から順に、目的の値 x と各要素を比較していく 2. x がいずれかの要素と一致した場合、そのインデックス(位置)を返す 3. 配列の最後