본문 바로가기

알고리즘/JAVA

2차원 배열 회전시키기(Rotate, Rotate Image, Java)

2차원 배열을 회전시켜야 하는 경우가 종종 발생한다. 일반적으로는 추가 배열을 선언해서, 90도 돌린 상태를 얻을 것이다. 배열이 n x n이라고 했을 때, (i, j)는 (j, n - 1 - i)로 변환된다.

 

 

## 추가배열 로테이트


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public void commonRotate(int[][] matrix){
        int n = matrix.length;
        int[][] nMatrix = new int[n][n];
        
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                nMatrix[j][n - 1 - i] = matrix[i][j]; 
            }
        }
        
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                matrix[i][j] = nMatrix[i][j];
            }
        }
    }

 

 

 

이제는 추가 배열없이 로테이트를 생각해보자, 일반적으로 코딩테스트에서 로테이트를 할 때는 위의 방식을 사용하면 되지만, 면접에서 추가적으로 배열을 선언하지 않고 코드를 작성하라고 할 수도 있다.

 

 

 

배열없이 로테이트 하는 방법은 2가지가 있다. 첫번째 방법은, 90도 회전 시 연관되는 점 4개를 찾아서, 순차적으로 값을 변경해주는 방식이다.

 

 

 

## 연관되는 점 4개 찾아서 순차적 변경


1
2
3
4
5
6
7
8
9
10
11
12
13
    public void fourRotate(int[][] matrix){
        int n = matrix.length;
        
        for(int i = 0; i < (n + 1/ 2; i++){
            for(int j = 0; j < n / 2; j++){
                int tmp = matrix[n - 1 - j][i];
                matrix[n - 1  - j][i] = matrix[n - 1 - i][n - 1 - j];
                matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
                matrix[j][n - 1 - i] = matrix[i][j];
                matrix[i][j] = tmp;
            }
        }
    }

 

 

 

마지막으로 소개할 방식이 어쩌면 가장 기억하기 쉽고 간단하다. Transpose와 Flip을 사용하는 방식이다. 아마 선형대 수학때 배웠을거 같다. 기억은 안나지만, 코드 자체는 간단하다.

 

 

 

## Transpose And Flip


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public void transposeAndFlip(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;
        
        for(int i = 0; i < row; i++){
            for(int j = i; j < col; j++){
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = tmp;
            }
        }
        
        for(int i = 0; i < row; i++){
            for(int j = 0; j < col / 2; j++){
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[i][col - 1 - j];
                matrix[i][col - 1 - j] = tmp;
            }
        }
    }