관리 메뉴

有希

LeetCode/Rotate Image 본문

프로그래밍/알고리즘+코딩테스트

LeetCode/Rotate Image

有希. 2022. 4. 20. 11:51

고등학교 때 배운 회전행렬을 이용하려 했었으나, 행렬의 idx를 우리가 기존에 쓰는 x,y 직교 좌표계로 변경해야 하는등 어려움이 있었다.

문제에서 주어진 그림을 뚫어져라 살펴보면 다음과 같다.

123456789 행렬을 예로 들면 변환 후 각 행의 구성 요소는 741 852 963 이다. 이는 기존의 행렬에서 각 원소를 대각선 기준으로 transpose 했을 때의 행 구성과 같다. 이제 각 행 별로 거꾸로 뒤집어 주면 똑같다.

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n=matrix.size();
   
        for(int i=0;i<n;i++)
            for(int j=0;j<i;j++)
                swap(matrix[i][j],matrix[j][i]);
    
        for(int i=0;i<n;i++)
            reverse(matrix[i].begin(),matrix[i].end());
    }
};

 

내 나름대로의 수학적 해석을 쓰자면, 기존의 변환행렬은 좌표를 이용하므로 좌표계에 종속적이지만 여기서는 대칭변환을 써서 괜찮다? 이다.

실제로 코드에서 하는 일을 좌표계로 생각해보면 y=-x 를 기준으로 대칭변환하고 y축을 기준으로 다시 한번 더 수행한다. 결국 시계방향으로 90도 회전변환 한 것과 같다.