본문으로 바로가기

2차원 배열 회전시키기

category Algorithm/개념 2021. 4. 17. 14:27

배열 회전

배열 arr
[1,2,3]
[4,5,6]
[7,8,9] 를
에서 90도를 회전시키면
[7,4,1]
[8,5,2]
[9,6,3] 가 된다

배열을 나누어서 잘 살펴보면 arr[0]에 있던 원소들이 arr[0][0], arr[0][1], arr[0][2]로 각각 들어간 것을 볼 수 있다

이런 규칙에 따라서

    function rotate (arr) {
        const temp = Array(arr.length).fill().map(()=>Array(arr.length).fill().map(()=>null));

        for(let y=0; y<arr.length;y++){
            for(let x=0; x<arr.length;x++){
                temp[y][x] = arr[arr.length-1-x][y];
            }
        }
        return temp;
    }

와 같이 시계 방향으로 회전시키는 함수를 만들 수 있다

두 번 회전은 함수를 두 번 세 번은 세 번 호출하면 되는 일이지만 그만큼 시간이 늘어나기 때문에 효율적이지 않은데

180도와 270도만큼 움직이는 경우의 인덱스들 또한 규칙적이기 때문에

    function rotate (arr) {
        const temp = Array(arr.length).fill().map(()=>Array(arr.length).fill().map(()=>null));

        for(let y=0; y<arr.length;y++){
            for(let x=0; x<arr.length;x++){
                // temp[y][x] = arr[arr.length-1-x][y]; // 90도
                // temp[y][x] = arr[arr.length-1-y][arr.length-1-x]; // 180도
                // temp[y][x] = arr[x][arr.length-1-y]; // 반시계
            }
        }
        return temp;
    }

위와 같은 함수를 작성할 수 있다

Array의 내장 함수 map을 이용하면 조금 더 간단하게 쓸 수 있다


    function rotate1(arr){
        return arr.map((row,y)=> row.map((col,x)=>{
            return arr[arr.length-1-x][y]
            // return arr[arr.length-1-y][arr.length-1-x];
            // return arr[x][arr.length-1-y]
            })
        );
    }

'Algorithm > 개념' 카테고리의 다른 글

비트 마스크  (0) 2021.05.16
Graph  (0) 2021.04.25
Sort - 기본  (0) 2020.12.18
에라토스테네스의 체  (0) 2020.12.13
Recursion - 순열  (0) 2020.12.11