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

Pythonで2次元行列を時計回りに90度回転させる方法

はじめに

本記事では、n × n の2次元行列を時計回りに90度回転させるアルゴリズムを、Pythonのコード例とともにわかりやすく解説します。

問題の概要

たとえば、次のような3 × 3 の行列が与えられたとします。

157
963
213

この行列を時計回りに90度回転させると、結果は以下のようになります。

291
165
337

解法のアプローチ

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

  • 一時的な格納用リスト temp_matrix を空の状態で用意します。
  • 行列の各列(0 から 行列の長さ - 1 まで)に対して、以下の処理を繰り返します。
    • 空のリスト temp を作成します。
    • 行インデックスを「最終行から先頭行へ」と逆順に走査し、matrix[row][column] の値を temp に追加していきます。
    • 完成した temptemp_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 を活用した簡潔な実装でも、どちらでも同じ結果が得られます。用途や可読性の要件に応じて使い分けるとよいでしょう。

  1. Pythonで行列(マトリックス)を初期化する2つの方法

    はじめに この記事では、Python 3.xにおいて2次元リストを使って行列(マトリックス)を初期化する方法を解説します。行列の初期化には大きく分けて2つのアプローチがあり、それぞれ特徴が異なります。 方法1:リスト内包表記を使う(Pythonらしい書き方) まずは、Pythonならではの直感的な初期化方法です。リスト内包表記を活用することで、内側のリスト(各行)を生成しながら、それを複数行へと一気に拡張できます。コードが簡潔になり、Pythonicなスタイルとして好まれる書き方です。 コード例 # 行数を指定 N = 3 # 列数を指定 M = 3 # リスト内包表記で行列を初期化(各要

  2. 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