Pythonで正方行列を反時計回りに90度回転させる方法
正方行列が与えられたとき、それを反時計回りに90度回転させることを考えてみましょう。
例として、次のような3×3の行列があるとします。
| 1 | 4 | 7 |
| 2 | 5 | 8 |
| 3 | 6 | 9 |
これを反時計回りに90度回転させると、出力は次のようになります。
| 7 | 8 | 9 |
| 4 | 5 | 6 |
| 1 | 2 | 3 |
解決のための手順
この問題は、「各行の反転」と「転置(行と列の入れ替え)」という2つの基本的な操作を組み合わせることで解くことができます。具体的な手順は以下の通りです。
- 行列が空である場合は、空のリストを返します
- n := 行列の行数とします
- 行列の各行に対して、その行を反転(リバース)します
- i を 0 から n-1 まで繰り返します:
- j を 0 から i-1 まで繰り返します:
- matrix[i][j] と matrix[j][i] の値を入れ替えます(転置)
- j を 0 から i-1 まで繰り返します:
- 処理後の行列を返します
なぜこの手順で反時計回りの回転になるのかというと、まず各行を左右に反転させると列の並びが逆になり、その後に転置を行うことで、元の行列の最初の列が最後の行へと移動するためです。結果として、反時計回りに90度回転した行列が得られます。
それでは、以下の実装例を見て理解を深めましょう。
実装例
class Solution:
def solve(self, matrix):
if not matrix or not matrix[0]:
return []
n = len(matrix)
for row in matrix:
row.reverse()
for i in range(n):
for j in range(i):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
return matrix
ob = Solution()
matrix = [
[1, 4, 7],
[2, 5, 8],
[3, 6, 9]
]
print(ob.solve(matrix))
入力
[
[1, 4, 7],
[2, 5, 8],
[3, 6, 9] ]
出力
[
[7, 8, 9],
[4, 5, 6],
[1, 2, 3]]
このアルゴリズムの計算量は O(n²) であり、n×n の正方行列に対して効率的に動作します。また、新しい行列を作成せずに入れ替えだけで処理しているため、追加のメモリ領域もほとんど必要としない点が特徴です。
-
Pythonでグラフの頂点間の到達可能性行列を計算するプログラム
隣接リスト形式で表現されたグラフが与えられたとき、次のような条件を満たす2次元行列Mを求めることを考えます。M[i, j] = 1:頂点iから頂点jへの経路(パス)が存在する場合M[i, j] = 0:経路が存在しない場合例えば、次のようなグラフが入力として与えられたとします。この場合の出力は、以下の5×5の行列になります。1111101111011110111101111解法のアプローチこの問題は、各頂点を起点とした幅優先探索(BFS)を用いることで効率的に解くことができます。具体的な手順は以下の通りです。n×nの2次元行列「ans」を作成し、すべての要素を0で初期化します(nは頂点の総数)
-
Pythonで行列の転置を求めるプログラム
この記事では、与えられた問題に対する解法とアプローチについて詳しく解説します。 問題文 ある行列が与えられたとき、その転置を同じ行列に格納し、結果を表示する必要があります。 行列の転置とは、行を列に、列を行に入れ替えたものです。言い換えれば、行列Aの転置は、要素A[i][j]をA[j][i]と入れ替えることで得られます。 実装例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): A[i][j], A[j][i] = A[j][i], A[i][j] # ドライ