algorithm/theory

n x n 행렬을 시계방향, 반시계방향으로 돌리는 방법.

qkqhxla1 2020. 4. 10. 22:54

https://leetcode.com/problems/rotate-image/discuss/18872/A-common-method-to-rotate-the-image


되게 일반적인 문제인데 여태까지 이걸 몰랐다...;코드를 그대로 가져온다.

/*
 * clockwise rotate
 * first reverse up to down, then swap the symmetry 
 * 1 2 3     7 8 9     7 4 1
 * 4 5 6  => 4 5 6  => 8 5 2
 * 7 8 9     1 2 3     9 6 3
*/
/* matrix의 길이를 n이라고 하면
0행과 n-1행을 변경, 1행과 n-2행을 변경, 등등등 반복 후 반복으로 돌면서 스왑해준다.*/
void rotate(vector > &matrix) {
    reverse(matrix.begin(), matrix.end());
    for (int i = 0; i < matrix.size(); ++i) {
        for (int j = i + 1; j < matrix[i].size(); ++j)
            swap(matrix[i][j], matrix[j][i]);
    }
}

/*
 * anticlockwise rotate
 * first reverse left to right, then swap the symmetry
 * 1 2 3     3 2 1     3 6 9
 * 4 5 6  => 6 5 4  => 2 5 8
 * 7 8 9     9 8 7     1 4 7
*/
// 각 행을 전부 거꾸로 만들어준후 각 행의 첫번째 인덱스가 첫번째 열, 두번째 인덱스가 두번째 열 ....
void anti_rotate(vector > &matrix) {
    for (auto vi : matrix) reverse(vi.begin(), vi.end());
    for (int i = 0; i < matrix.size(); ++i) {
        for (int j = i + 1; j < matrix[i].size(); ++j)
            swap(matrix[i][j], matrix[j][i]);
    }
}