Python/DSA

rotate image

papayetoo 2020. 9. 5. 21:38

행렬을 시계방향으로 90도 만큼 회전 시키는 문제이다.

 

90도 회전은

  1. 행렬을 전치(Transpose) 한다.
  2. 전치된 행렬에서 각 행에 저장된 값을 역순으로 한다.

이 순서를 따르면 행렬이 90도 회전된 결과를 얻을 수 있다. 다만, 문제에서는 in-place 회전을 원하기 때문에 다른 방법을 이용해야 한다.

 

다른 방법으로 90도 회전시키기 위해서는

  1. 행렬의 길이 n이라고 했을 때 윗쪽 절반 행들과 아랫쪽 절반 행들의 위치를 바꾼다.
  2. 위치를 바꾼 후에 모든 원소에 대해서 (r,c) 와 (c,r)에 위치하는 값을 한번만 바꾼다.

Rotate Image 문제 원본

from typing import List


class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        for r in range(len(matrix) // 2):
            matrix[r], matrix[len(matrix) - r - 1] = matrix[len(matrix) - r - 1], matrix[r]

        visited = []
        for r in range(len(matrix)):
            for c in range(len(matrix)):
                if r != c and (r, c) not in visited:
                    visited.append((r, c))
                    visited.append((c, r))
                    matrix[r][c], matrix[c][r] = matrix[c][r], matrix[r][c]
        print(matrix)

    def rotate2(self, matrix: List[List[int]]) -> None:
        matrix = [[col for col in row] for row in zip(*matrix)]
        for r in matrix:
            r.reverse()
        print(matrix)


if __name__ == '__main__':
    arr = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]
    s = Solution()
    s.rotate(arr)

깃헙 주소 github.com/papayetoo/StudyinPython/blob/master/LeetCode/rotate_image.py