배열을 90도 회전시키는 방법

2022. 8. 9. 18:07알고리즘

올해 4월이었나 카카오 인턴 코테를 아무 준비 없이 경험삼아서 본 적이 있습니다.

근데 이제 거기서 나왔던 문제가 N X N 배열을 조금씩 회전하는 게 5번문제였던 기억이 납니다.

([0][0] => [0][1] / [1][0] => [0][0] 이런 느낌의 회전이었어요ㅠㅠ)

 

가운데 중점 기준으로 교차하는 직선 두개 그리면서 규칙성 찾다가 하지도 못하고 끝났었는데요. 갑자기 ptsd 오네요.

 

이 회사 코테는 참 배열 회전하는걸 좋아하나봐요. 2020년에도 2021년에도 배열 90도 회전하는 문제가 나왔었습니다.

이젠 뭐 90도는 다 잘한다고 생각해서 이런걸 내는건지..

불평하면 달라질까요? 신입이면 하라면 해야죠! 일단 차근차근 90도 회전부터 다뤄보죠!

 

(왼쪽) 원본 배열 => (오른쪽) 90도 시계방향 회전 배열

 

90도 회전은 그나마 합리적입니다.

몇 가지 규칙이 있거든요.

 

첫 번째 row를 기준으로 이런 규칙성이 성립합니다.

- (원본) row + (rotate) col = N -1( 4 X 4 배열이니 N = 4)
- (원본) col = (rotate) row

그러면 규칙성대로 정방향 회전하는 함수를 같이 한번 짜보죠!

 

solution) 90 deg rotate

function rotate(arr) {
    const [maxRow, maxCol] = [arr.length, arr[0].length];
    const result = Array.from({length: maxRow}, () => Array(maxCol).fill(0));
    for (let row = 0; row < maxRow; row++) {
        for (let col = 0; col < maxCol; col++) {
            result[col][maxRow - row - 1] = arr[row][col];
        }
    }
    return result;
}

 

조심하셔야 할 점은 N x N 형태의 배열이 아니라 N x M 형태의 배열인 경우입니다.

2 x 3이 3 x 2 형태로 변환되기 때문에 외부에서 index 같은 걸로 조작할 때 런타임 에러를 조심하셔야 해요.

 

다음엔 한번씩 회전하는 방법을 들고 올까 합니다. 그럼 이만!