본문으로 바로가기

기존 2차원 배열의 값을 90도 회전시킬 수 있도록 코드를 짜시오.

LeetCode에서 푼 문제 리스트 보기

LeetCode에서 문제 보기

Github에서 코드 보기

문제 조건

새로운 배열을 반환하지 않고 기존 배열을 변형해서 사용해야 한다.(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