有希
LeetCode/Rotate Image 본문
고등학교 때 배운 회전행렬을 이용하려 했었으나, 행렬의 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도 회전변환 한 것과 같다.
'프로그래밍 > 알고리즘+코딩테스트' 카테고리의 다른 글
LeetCode/Pow(x,n) (0) | 2022.04.29 |
---|---|
LeetCode/Group Anagrams (0) | 2022.04.20 |
LeetCode/Permutations (0) | 2022.04.20 |
LeetCode/Find First and Last Position of Element in Sorted Array (0) | 2022.04.12 |
HackerRank/Merge two sorted linked lists (0) | 2022.04.05 |