반응형
위처럼 배열을 회전시키고 싶을 때 사용하는 방법이다. 일단 [2][3] 형태의 int형 배열이 메모리에 잡혀있다고 가정하겠다. 사람이 생각하면 쉽지만 코드로 구현할려면 어려운데 알고보면 간단한 규칙이 존재한다.
4번을 선택
배열의 인덱스는 0부터 시작한다고 했을때 4번의 좌표는 (1,0) 이고 회전 한곳에 좌표는 (0,0) 이란걸 알 수 있다.
"5"번을 예시로들면 (1,1) -> (1,0) 으로 이동하였다. 여기서 규칙을 발견한다.
(1 , 1 ) -> (1 , 0)
빨간색으로 표신된 영역이 서로 같다는 것!
따라서 다음과같이 표현할 수있다. 여기서 2는 처음 배열의 세로의 크기(위아래의 크기)라는것을 알아낸다.
구현
그럼 이제 아그러면 저식대로 배열을 넣으면 되는 거겟지?? 하고 생각할 수있지만 실수를 자주 하는게 있다.
바로 배열이 회전하면서 배열의 크기가 달라진다는 것이다. 따라서 왼쪽 배열을 회전한다고 했을때 새로운 배열을 선언하고 각 요소에맞게 숫자를 넣으면 손쉽게 회전을 표현 할 수있다.
핵심 코드
private static int[][] rotate(int[][] m) {
int N = m.length;
int M = m[0].length;
// 돌린 크기만큼으로 생성해준다.
int[][] copyMap = new int[M][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
copyMap[j][N - 1 - i] = m[i][j];
}
}
// 새로 돌린 배열로 반환해준다.
return copyMap;
}
rotate함수는 int[][]를 반환하는 함수이다. 새로운 copyMap을 선언하고 기존 가로 세러 (N,M)크기에 대해서 M,N의 크기로 선언한다. 그리고 다음 그림처럼 식을 이용해서 값을 집어넣어서 배열을 채운후 새로운 copyMap 배열을 반환한다.
전체소스
package excercise;
public class RotateEx {
public static void main(String[] args) {
int[][] map = new int[2][3];
int p = 1;
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
map[i][j] = p++;
}
}
for (int d = 0; d < 4; d++) {
print(map);
map = rotate(map);
}
}
private static int[][] rotate(int[][] m) {
int N = m.length;
int M = m[0].length;
// 돌린 크기만큼으로 생성해준다.
int[][] copyMap = new int[M][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
copyMap[j][N - 1 - i] = m[i][j];
}
}
// 새로 돌린 배열로 반환해준다.
return copyMap;
}
private static void print(int[][] map) {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
System.out.println();
}
}
1 2 3
4 5 6
4 1
5 2
6 3
6 5 4
3 2 1
3 6
2 5
1 4
반응형
'TOPIC' 카테고리의 다른 글
JOIN 안에 SUB쿼리를 JOIN으로 바꿔보자 (1) | 2021.01.17 |
---|---|
Junit5 기능 정리 (0) | 2021.01.14 |
Access Token 클라이언트 보안전략 (0) | 2020.09.01 |
Spring boot image를 등록하고 이미지를 불러오는 방법 (3) | 2020.07.29 |
캡스톤 : 아두이노 안드로이드 블루투스 통신 (0) | 2020.07.04 |