(Matrix, Medium) Rotate Image

송재호·2025년 8월 8일
0

https://leetcode.com/problems/rotate-image/description/

우측으로 90도 돌리는 경우 핵심은 두 가지다.
1. 전치 (행과 열을 바꿈)
2. 반전 (n - 1 - i) , 여기서 n은 length, i는 순회 인덱스

for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        rotated[j][n - 1 - i] = matrix[i][j];
    }
}

즉 새 배열을 만들어서 푸는 경우 위 공식을 적용해 아래와 같이 회전할 수 있다.

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        int[][] rotated = new int[n][n];

        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                rotated[j][n - 1 - i] = matrix[i][j];
            }
        }

        // print용 !!
        for (int[] row : rotated) {
            for (int val : row) {
                System.out.print(val + " ");
            }
            System.out.println();
        }
    }
}

근데 이 문제는 in-place로 풀어야 하는 문제다.
정사각형이라고 가정하면, 2가지 공식을 그대로 적용해서 스왑을 할 수 있겠다.

다만 전치와 반전 과정에서, 이미 했던 요소를 다시 바꾸는 문제가 있을 수 있으므로
범위 제한 과정에 신중해야 한다.

그래서 전치(첫 번째 루프)는 j는 i부터 시작하도록 하며,
반전(두 번째 루프)는 각 행 절반씩만 수행한다.

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        
        for (int i=0; i<n; i++) {
            for (int j=i; j<n; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }

        for (int i=0; i<n; i++) {
            for (int j=0; j<n/2; j++) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][n - 1 - j];
                matrix[i][n - 1 - j] = temp;
            }
        }
    }
}
profile
식지 않는 감자

0개의 댓글