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;
}
}
}
|
'알고리즘 > JAVA' 카테고리의 다른 글
[알고리즘] Trie 자료구조 Java 코드 (0) | 2020.10.18 |
---|---|
[JAVA] 소수점 자릿수 출력하기(백준 3053, 택시 기하학) (0) | 2020.08.15 |
자바 공백포함 문자열 읽고 단어 단위로 자르기 (0) | 2020.08.02 |