Java/Daily-Java

[Array] 2차원 배열의 90도 회전

모모토 2021. 4. 20. 23:57

● 2차원 배열을 90도 회전시키려면 어떻게 해야 할지를 생각해보자

 

주어진 배열↓

char[][] star = {
{'*','*',' ',' ',' '},
{'*','*',' ',' ',' '},
{'*','*','*','*','*'},
{'*','*','*','*','*'}
};

star 2차원 배열을 90도 돌려놓은 2차원 배열 result 배열을 생성하여 star배열의 성분들을 옮길 것이다. 그리고 그 안의 성분들을 정말로 90도 회전하여 옮긴다는 생각으로 코드를 짜 보자

 

1) 배열의 회전

 

4행 5열의 2차원 star배열의 성분들을 옮겨 담을 곳 result 배열을 생성, 이제 star의 행을 90도 회전시켜서 넣을지 열을 회전시켜 넣을지 고민해봐야 한다. 공부하는 입장이기에 2가지의 경우를 모두 생각해보자

 

1-A) star의 열을 90도 회전시켜서 result에 넣어보자

 

우리는 배열이라면 기본적으로 for문을 이용하여 값을 넣어야 한다 일반적인 경우는 '거의' 말이다. 2차원 배열의 for문은 특별한 일이 없는 한 2개의 for문으로 가정해볼 때 for문의 조건식 변수는 i, j이다. 다음 사진에서 보면 파란 박스의 0은 i로 설정하고 빨간 박스는 j로 설정해볼 때 star의 j와 result의 j가 서로 반대방향으로 증감하는 것을 알 수 있다. 이를 해결하기 위해선 for문을 추가한다던지 다른 방식으로 해결해볼 수는 있겠지만 그게 좋은 방법이라고 단언할 수 없다 그러한 방법을 생각하기 까지도 오래 걸린다. 현재의 나로선 생각이 나지 않는다.

 

1-B) star의 행을 90도 회전시켜 result에 넣어보자

 

다음을 보면 사진 중앙을 기준으로 왼쪽은 star의 첫 번째 행을 90도 회전, 오른쪽은 두 번째 행을 90도 회전시킨 것이다. (헷갈리지 말아야 할 것은 표현은 회전이지만 실제론 star의 배열 값을 result에 넣어주는 것이다. 그래서 그림처럼 표현한 것) 첫째 시도에서 변하는 변수 변하지 않는 변수 첫째 시도와 둘째 시도를 비교했을 때 그대로인 변수와 변하는 변수를 유심히 관찰해보면 아래처럼 세 가지 색으로 변수들을 구분할 수 있다. 특히 star.length-1-i는 result의 끝열부터 채워나가야 하기 때문에 배열의 길이를 이용하여 index를 계산하고 i값을 빼주면서 i의 시도 횟수마다 끝에서부터 한줄한줄씩 채워나간다.  

 

2) for문의 작성

 

위에서 설명을 토대로 for문을 짜 보면 다음과 같다. 

 

 


Answer

public class Array {
	public static void main(String[] args) {
		char[][] star = {
				{'*','*',' ',' ',' '},
				{'*','*',' ',' ',' '},
				{'*','*','*','*','*'},
				{'*','*','*','*','*'}
				};
		
		char[][] result = new char[star[0].length][star.length]; //90도 돌려서 넣을 배열
		
		for(int i=0; i<star.length;i++) {
			for(int j=0; j<star[i].length;j++) {
				System.out.print(star[i][j]);
			}
			System.out.println();
		}
			for(int i=0;i<star.length;i++) { // << 이번에 구한 for문
				for(int j=0;j<star[i].length;j++) {
					
					int x = j;
					int y = star.length-1-i;
					result[x][y]=star[i][j]; // 행렬좌표의 90도 이동
			
					
					
				}
			}
		for(int i=0;i<result.length;i++) {
			for(int j=0;j<result[i].length;j++) {
				System.out.print(result[i][j]);
			}
			System.out.println();
		}
	}
}