기존 2차원 배열의 값을 90도 회전시킬 수 있도록 코드를 짜시오.
문제 조건
새로운 배열을 반환하지 않고 기존 배열을 변형해서 사용해야 한다.(in-place 방식)
문제 풀이
새로운 배열을 반환해도 된다면, zip() 메소드를 사용해서 쉽게 결과물을 구할 수 있다. 하지만 기존 배열을 활용해야 한다면, Rotate()를 하였을 때 기존 값의 위치와 새로운 위치에서 어떤 규칙으로 이동하였는지 찾으면 문제를 풀수 있다. 이런 유형의 문제를 풀 때, 내가 선호하는 방식은 충분히 그릴 수 있을 만한 작은 케이스를 찾아서 직접 위치값(R,C)의 변화를 그려내 규칙을 찾아내는 것이다.
먼저 matrix를 deepcopy() 메소드를 활용해 temp_maxtirx 변수에 깊은 복사를 해주었다. 기존 matrix에는 temp_matrix에 저장되어 있던 값이 들어간다. 그렇다면 회전시켰을 대 어떤 위치의 값이 들어가야 회전한 것처럼 보일지 규칙을 찾아보자. 그림을 참고해서 보면, 기존 위치가 (R,C)라면 (C,R)로 위치가 바뀐 상태에서 R의 값이 서서히 줄어들고 있다.
아래 파이썬 코드의 2중 for문은 rotate하였을 때 각각의 값을 어느 위치(R,C)에서 가져와야 할지에 대해서 만들어졌다. 이 2중 for문에서 (0,0) ~ (n-1, n-1)까지 순회하는 for문의 규칙을 찾아내었다. (c, abs(r - last_index)) 으로 하였을 때 순차적으로 순회하는 위치 정보가 나온다. 이제 위의 모든 정보를 활용해서 파이썬으로 코드를 짜면 올바른 결과를 낼 수 있다.
파이썬 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import copy
class Solution:
def rotate(self, matrix) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
"""
Rumtime : faster than 72.69% of Python3
Memory Usage : less than 5.35% of Python3
"""
temp_maxtrix = copy.deepcopy(matrix)
n = len(matrix[0])
for c in range(n):
for r in range(n-1, -1, -1):
last_index = n - 1
matrix[c][abs(r - last_index)] = temp_maxtrix[r][c]
|
cs |
'온라인 코딩 테스트 문제 풀이 > LeetCode 문제 풀이' 카테고리의 다른 글
Python으로 푸는 LeetCode 152. Maximum Product Subarray (Medium) (0) | 2019.04.23 |
---|---|
Python으로 푸는 LeetCode 151. Reverse Words in a String (Medium) (0) | 2019.04.22 |
Python으로 푸는 LeetCode 832. Flipping an Image (Easy) (0) | 2019.04.18 |
Python으로 푸는 LeetCode 657. Robot Return to Origin (Easy) (0) | 2019.04.16 |