[Medium] Rotate Image

문제

You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise).

You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.

 

이미지를 나타내는 n x n 2D 매트릭스가 제공되면 이미지를 90도(시계 방향) 회전합니다.
이미지는 제자리에서 회전해야 합니다. 즉, 입력 2D 매트릭스를 직접 수정해야 합니다. 다른 2D 매트릭스를 할당하지 않고 회전을 수행합니다.

 

예시

Example 1:

Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [[7,4,1],[8,5,2],[9,6,3]]

Example 2:

Input: matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
Output: [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

 

제약 조건

Constraints:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

 

해결 과정

아직 matrix를 다루는 것이 익숙치 않아 NeetCode 강의를 보며 JavaScript로 코드를 변환하여 해결하였다.

해설을 잘 해주셔서 금방 이해할 수 있었다.

  • 우선 left를 뜻하는 l, right를 뜻하는 r를 초기화한다. 각각 matrix의 인덱스 값을 할당한다.
  • l < r 때까지 wile문을 순회한다.
    • for문을 돈다. 이때 i 가  r - l보다 작을 때까지( == l < r ) 순회한다.
      • top과 bottom을 l과 r로 초기화한다. (맨 꼭짓점부터 시작하기 때문)
      • topleft, topright, bottomleft, bottomright를 시계방향으로 값을 바꾸어준다.
      • 다음 for문에서는 한 칸씩 옆으로 이동해야 하기 때문에 이동할 인덱스에 + i, - i 처리를 한다.
    • for문을 다 돌았다면 inner matrix에 접근하기 위해 r++, l--를 한다.
  • while문의 순회가 끝나면 원본 matrix의 값이 변해있기 때문에 따로 반환을 하지 않아도 된다.

 

 

해결 코드

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var rotate = function(matrix) {
    let l = 0;
    let r = matrix.length - 1;
    
    while(l < r){
        for(let i = 0 ; i < r - l; i++){
            let top = l;
            let bottom = r;
            
            // save the topleft
            let topLeft = matrix[top][l + i];
            
            // move bottom left into top left
            matrix[top][l + i] = matrix[bottom - i][l];
            
            //move bottom right into botom left
            matrix[bottom - i][l] = matrix[bottom][r - i];
            
            // move top right into bottom right
            matrix[bottom][r - i] = matrix[top + i][r];
            
            // move top left into top right
            matrix[top + i][r] = topLeft;     
            
        }        
        r -= 1;
        l += 1;        
    }
};

 


참고 사이트

NeetCode : Rotate Image - Matrix - Leetcode 48

https://www.youtube.com/watch?v=fMSJSS7eO1w 

 

'leetCode' 카테고리의 다른 글

[Medium] Spiral Matrix  (0) 2022.07.01
[Easy] 1886. Determine Whether Matrix Can Be Obtained By Rotation  (0) 2022.06.30
[Easy] 58. Length of Last Word  (0) 2022.06.17
[Medium] 739. Daily Temperatures  (0) 2022.06.17
[Easy] 67. Add Binary  (0) 2022.06.15