재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
cf) 시간초과가 발생할 경우
1. 출력 시 Println보다는 StringBuilder 이용.
sb.append("출력할 내용\n"); 이렇게 넣는 것보다 sb.append("출력할 내용").append('\n');와 같이 구현하는 것이 속도가 더 빠르다.
2. 입력 받을 시 Scanner보다 BufferedReader 이용.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Star_10 {
static char[][] star;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
star = new char[N][N];
Pattern(0, 0, N, false);
System.out.println(print(star));
br.close();
}
static void Pattern(int row, int col, int size, boolean blank) {
if (blank) {
blank(row, col, size);
return;
}
if (size==1) {
star[row][col] = '*';
return;
}
int cnt=0;
int newsize = size/3;
for(int i=row; i<row+size; i+=newsize) {
for(int j=col; j<col+size; j+=newsize) {
if(cnt==4) {
Pattern(i, j, newsize, true);
}else {
Pattern(i, j, newsize, false);
}
cnt++;
}
}
}
static void blank(int row, int col,int size) {
for(int i=row; i<size+row; i++) {
for(int j=col; j<size+col; j++) {
star[i][j]=' ';
}
}
}
static StringBuilder print(char[][] star) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < star.length; i++) {
for (int j = 0; j < star.length; j++) {
sb.append(star[i][j]);
}
sb.append('\n');
}
return sb;
}
}