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;
}
}
}
}