본문 바로가기

TOPIC

JAVA : 배열 회전, 배열 90도 회전 방법

반응형

 

90도 회전

 

위처럼 배열을 회전시키고 싶을 때 사용하는 방법이다. 일단 [2][3] 형태의 int형 배열이 메모리에 잡혀있다고 가정하겠다. 사람이 생각하면 쉽지만 코드로 구현할려면 어려운데 알고보면 간단한 규칙이 존재한다.

 

4번을 선택

 

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 

 

반응형