행렬을 시계방향으로 90도 만큼 회전 시키는 문제이다.
90도 회전은
- 행렬을 전치(Transpose) 한다.
- 전치된 행렬에서 각 행에 저장된 값을 역순으로 한다.
이 순서를 따르면 행렬이 90도 회전된 결과를 얻을 수 있다. 다만, 문제에서는 in-place 회전을 원하기 때문에 다른 방법을 이용해야 한다.
다른 방법으로 90도 회전시키기 위해서는
- 행렬의 길이 n이라고 했을 때 윗쪽 절반 행들과 아랫쪽 절반 행들의 위치를 바꾼다.
- 위치를 바꾼 후에 모든 원소에 대해서 (r,c) 와 (c,r)에 위치하는 값을 한번만 바꾼다.
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
'Python > DSA' 카테고리의 다른 글
[Union-Find] Friend-Circle (0) | 2020.10.05 |
---|---|
Longest Increment Subsequence (0) | 2020.09.03 |
DP 문제 Number of dice rolls with target (0) | 2020.09.02 |
Permutation(순열) 알고리즘 (0) | 2020.08.29 |
댓글