CodeSignal

rotateImage

Doromi 2024. 2. 28. 23:46
728x90
반응형
주어진 2D 행렬을 90도 시계 방향으로 회전시키는 문제
추가적인 메모리를 O(1)만 사용하여 풀어야 합니다. 여기서는 주어진 행렬을 원래의 행렬에 덮어씌우면서 회전을 진행하는 방법을 사용할 수 있습니다. 이를 위해서는 주어진 행렬을 다음과 같이 네 단계로 나눠서 회전시킬 수 있습니다:

주어진 행렬을 대각선을 기준으로 대칭시킵니다.
행렬의 각 행을 뒤집습니다.
int[][] solution(int[][] a) {
   int n = a.Length;
   
   for(int i = 0;i<n;i++){
       for(int j = 0;j<i;j++){
           int tmp = a[i][j];
           a[i][j] = a[j][i];
           a[j][i] = tmp;
       }
   }
   
   for(int i = 0;i<n;i++){
       for(int j = 0;j<n/2;j++){
           int tmp = a[i][j];
           a[i][j] = a[i][n-1-j];
           a[i][n-1-j] = tmp;
       }
   }
    return a;
}

예를 들어,

a = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]


의 경우,

첫번째로 대각선 대칭을 하면,

a = [[1, 4, 7],
     [2, 5, 8],
     [3, 6, 9]]

가 되고,

여기서 행 반전을 하게 되면

a = [[7, 4, 1],
     [8, 5, 2],
     [9, 6, 3]]

원하는 결과가 나오는 것을 확인할 수 있습니다.

 

180도의 경우는 그럼 90도 한 것을 2번 수행하면 나올 것입니다.

728x90
반응형