코딩테스트/백준

[Java] 백준 2447 : 별 찍기 -10

플래시🦥 2023. 2. 22.
반응형
https://www.acmicpc.net/problem/2447
 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net


문제를 이해하기 위해서 예제 출력을 분해해 봤다. 

크기가 3(=3 ¹)일 때는 가운데 공백이 있고, 가운데를 제외한 모든 칸에 별이 있는  모양이다. 

3(=3¹)

그리고 N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3) ×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 

예를 들어, N = 3²=9일때, 가운데에 3*3의 공백이 있고 그 주위를 3의 패턴으로 둘러싼 형태이다. 

3²=9

마찬가지로 N=3³=27은 아래와 같이 그릴 수 있다. 

3³=27

 이걸 사이즈를 줄여가면서 재귀해 주면 된다.

N*N배열을 선언주고 미리 공백으로 모두 채워주었다. 

 

star(0,0, N)을 호출해서 가장 큰 모양을 시작으로 N==1이 아니면 계속해서 재귀호출을 하도록 해서 가장 작은 1의 단위로 만들어지게 했다. 

3*3의 반복문안에서 i=1, j=1일 때는 무조건 공백이기 때문에 조건문으로 재귀 호출을 하지 않도록 해주고 

이 외에는 각각 n/3의 크기로 사이즈를 나누어 주었다. 

static void star(int x, int y, int n) {
		if(n==1) {
			arr[x][y]="*";
			return;
		}
		
		 for (int i = 0; i < 3; i++) {
	            for (int j = 0; j < 3; j++) {
	                if (!(i == 1 && j == 1)) {
	                    star( x + i * (n / 3), y + j * (n / 3), n / 3);
	                }
	            }
	        }
		
	}//star()

x와 y 좌표에 각각 i*(n/3)을 더해준 이유는 나누어진 패턴의 시작 좌표가 

N=27을 기준으로 (x,y,size) 일 때 

(0,0,9) (0,9,9) (0,18,9)

(9,0,9) (9,9,9) (9,18,9)

(18,0,9) (18,9,9) (18,18,9) 

이기 때문이다. 

 


import java.io.*;
import java.util.*;

public class Main {
	
	static int N;
	static String[][] arr;
	static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		N = Integer.parseInt(br.readLine());
		arr = new String[N][N];
		for(int i=0;i<N;i++)
			Arrays.fill(arr[i]," ");
		star(0,0,N);
		
		 for (int i = 0; i < N; i++) {
	            for (int j = 0; j < N; j++) {
	            	sb.append(arr[i][j]);
	            }
	            sb.append("\n");
		 }
		System.out.println(sb);
	}// main()
	
	static void star(int x, int y, int n) {
		if(n==1) {
			arr[x][y]="*";
			return;
		}
		
		 for (int i = 0; i < 3; i++) {
	            for (int j = 0; j < 3; j++) {
	                if (!(i == 1 && j == 1)) {
	                    star( x + i * (n / 3), y + j * (n / 3), n / 3);
	                }
	            }
	        }
		
	}//star()

}// class Main

 

728x90
반응형

댓글