복습

백준 2447번 - 재귀함수 별찍기 본문

알고리즘

백준 2447번 - 재귀함수 별찍기

ykm1256 2020. 6. 9. 15:41

착안점 : 크기가 3인 패턴이 기본 패턴이 되고, 숫자가 커지면 하위 패턴이 기본 패턴의 별 하나가 된다. 즉, 크기가 9라면 크기가 3인 기본 패턴에서 별 하나가 크기가 3인 3X3 패턴전체가 된다.

 

알고리즘 : 재귀함수를 이용해서 배열에 배열의 순서가 아닌 패턴에 맞게 별을 넣는다. 배열을 출력하면 위와 같이 출력되지만 실제로는 배열에 별이 입력되는 순서는 arr[0][0]에서 시작하여 크기 3인 기본패턴이 입력된 후 arr[3][0]에서부터 또 기본패턴이 입력된다. 즉, 시작점을 옮기면서 기본패턴을 하나씩 입력해 나가는 것이다.

 

정답코드

import java.util.*;

public class Main {
	static char arr[][];	//메인과 Star 함수 모두에서 사용하기 위해 static 변수로 선언

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();	// 크기 N을 받아옴
		arr = new char[N][N];	// 크기가 NXN인 배열 생성
		
		for(int i=0; i<arr.length;i++) {
			Arrays.fill(arr[i], ' ');	// 배열의 모든 값을 ' '(공백)으로 초기화
		}
		
		Star(0,0,N);	// 별 찍기 함수 불러오기
		
		for(int i=0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
		
	}
	
	public static void Star(int a, int b, int N) {	// 시작점 a,b와 크기 N을 받아옴
		int d = N/3;	// 크기를 3으로 계속 나누어 1이 되게 하여 별을 찍음
		
		if(N==1) {
			arr[a][b] = '*';	// N=1 일 때 해당 배열 위치에 별을 찍음
			return;
		}
		
		for(int i=0;i<3;i++) {		// 기본 패턴의 크기가 3X3이므로 for문도 3x3으로 돌아감
			for(int j=0;j<3;j++) {
				if(i==1&&j==1) continue;	// 가운데 값에는 별을 찍지 않으므로 넘어감
				Star(a+(d*i),b+(d*j),d);	// 시작점을 옮기면서 기본 패턴을 찍음
			}
		}		
	}
}

- N이 3의 거듭제곱이므로 3으로 계속 나누어 N=1이 되게하여 기본 패턴을 찍는다.

- 그리고 시작점을 N/3 만큼씩 옮겨 기본 패턴을 계속 찍어나간다.

- 크기가 9라면 arr[0][0]에서 시작하여 arr[2][2]까지 기본패턴을 찍은 후 9/3=3 만큼 시작점을 옮겨 arr[0][3]에서 시작하    여 arr[2][5]까지 기본 패턴을 찍는 식이다. 즉, 배열의 순서가 아닌 기본 패턴에 맞는 순서대로 별을 찍어 나간다.

- 만약, 크기가 27이 되면 위에서 설명한 크기가 9일 때의 경우를 실행한 후 27/3=9 만큼 시작점을 옮겨 또 크기가 9인    패턴을 찍어나가는 식이다.