Pythonで2次元行列を時計回りに90度回転させる方法
はじめに
本記事では、n × n の2次元行列を時計回りに90度回転させるアルゴリズムを、Pythonのコード例とともにわかりやすく解説します。
問題の概要
たとえば、次のような3 × 3 の行列が与えられたとします。
| 1 | 5 | 7 |
| 9 | 6 | 3 |
| 2 | 1 | 3 |
この行列を時計回りに90度回転させると、結果は以下のようになります。
| 2 | 9 | 1 |
| 1 | 6 | 5 |
| 3 | 3 | 7 |
解法のアプローチ
この問題は、以下の手順で解くことができます。
- 一時的な格納用リスト
temp_matrixを空の状態で用意します。 - 行列の各列(0 から 行列の長さ - 1 まで)に対して、以下の処理を繰り返します。
- 空のリスト
tempを作成します。 - 行インデックスを「最終行から先頭行へ」と逆順に走査し、
matrix[row][column]の値をtempに追加していきます。 - 完成した
tempをtemp_matrixに追加します。
- 空のリスト
- 最後に、
temp_matrixの内容を元の行列matrixに書き戻します。
ポイントは、「右下から左上へ向かって列ごとに要素を拾い集める」ことで、これがそのまま回転後の行になるという点です。計算量は O(n²)、追加のメモリも O(n²) 必要となります。
Pythonでの実装例
それでは、実際のPythonコードを見てみましょう。
class Solution(object):
def rotate(self, matrix):
temp_matrix = []
column = len(matrix) - 1
for column in range(len(matrix)):
temp = []
for row in range(len(matrix) - 1, -1, -1):
temp.append(matrix[row][column])
temp_matrix.append(temp)
for i in range(len(matrix)):
for j in range(len(matrix)):
matrix[i][j] = temp_matrix[i][j]
return matrix
ob1 = Solution()
print(ob1.rotate([[1,5,7],[9,6,3],[2,1,3]]))入力
[[1,5,7],[9,6,3],[2,1,3]]
出力
[[2, 9, 1], [1, 6, 5], [3, 3, 7]]
補足:よりPythonicな書き方
上記の実装では明示的にループを回していますが、Pythonでは転置(transpose)+各行の反転を組み合わせることで、より簡潔に回転を実現できます。
def rotate(matrix):
return [list(row) for row in zip(*matrix[::-1])]この一行では、まず matrix[::-1] で行の並びを上下反転させ、その後 zip(*...) によって転置を行っています。結果として、時計回りに90度回転した行列が得られます。
まとめ
n × n の2次元行列を時計回りに90度回転させるには、「列を下から上へ読み取り、それを新しい行として再構築する」という考え方が基本となります。ループを使った素直な実装でも、zip を活用した簡潔な実装でも、どちらでも同じ結果が得られます。用途や可読性の要件に応じて使い分けるとよいでしょう。
-
Pythonで行列(マトリックス)を初期化する2つの方法
はじめに この記事では、Python 3.xにおいて2次元リストを使って行列(マトリックス)を初期化する方法を解説します。行列の初期化には大きく分けて2つのアプローチがあり、それぞれ特徴が異なります。 方法1:リスト内包表記を使う(Pythonらしい書き方) まずは、Pythonならではの直感的な初期化方法です。リスト内包表記を活用することで、内側のリスト(各行)を生成しながら、それを複数行へと一気に拡張できます。コードが簡潔になり、Pythonicなスタイルとして好まれる書き方です。 コード例 # 行数を指定 N = 3 # 列数を指定 M = 3 # リスト内包表記で行列を初期化(各要
-
Pythonの文字列スライスで文字列を回転させる方法
文字列が与えられたとき、その文字列を2つの方向にスライスして回転させるのが本記事の目的です。1つは時計回り(右回転)、もう1つは反時計回り(左回転)です。1. 与えられた文字列を d 要素分だけ左(反時計回り)に回転させます(d <= n)。2. 与えられた文字列を d 要素分だけ右(時計回り)に回転させます(d <= n)。実行例Input: string = pythonprogram d = 2 Output: Left Rotation: thonprogrampy Right Rotation: ampythonprogrアルゴリズムStep 1: 文字列を入力する。 S