https://www.acmicpc.net/problem/2447
문제


풀이
주어진 크기 N에 대해 재귀적인 규칙에 따라 가운데가 비어있는 패턴을 그리는 문제이다
`drawStar(x좌표, y좌표, size)` 재귀 함수를 정의해보자. (x, y)를 왼쪽 위 꼭짓점으로 하는 size * size 크기의 정사각형에 패턴을 그리는 역할을 한다
기저 조건: 만약 size가 1이면 더 이상 쪼갤 수 없으므로 (x, y)에 별을 찍고 return
재귀 단계
- 현재 size * size 정사각형을 3 * 3 그리드로 나눈다. 나눈 정사각형의 크기는 `size / 3` 이다
- 3 * 3 그리드의 9칸을 순회
- 가운데 칸(i=1, j=1)은 건너뛴다. (공백 처리)
- 나머지 8칸에서는 새로운 시작 좌표와 newSize를 인자로 넘겨 재귀 함수를 호출
- `drawStar(x + i * newSize, y + j * newSize, newSize)`
N = 9 인 경우를 그림으로 보면 다음과 같다

결과를 저장할 `char[][] `배열을 `' '`(공백)으로 초기화 시키고 시작하면 `*` 찍는 것에만 집중하면 된다
자세한 것은 코드를 보자
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N, K;
static char[][] star;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(br.readLine());
star = new char[N][N];
// 공백으로 초기화
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
star[i][j] = ' ';
}
}
drawStar(0, 0, N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(star[i][j]);
}
sb.append("\n");
}
System.out.println(sb);
br.close();
}
static void drawStar(int r, int c, int size) {
// 기저 조건
if (size == 1) {
star[r][c] = '*';
return;
}
// size * size 정사각형을 3 * 3 그리드로 나눔
int newSize = size / 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) continue; // 가운데 칸 공백 처리
// 새로운 좌표에서 재귀 호출
drawStar(r + i * newSize, c + j * newSize, newSize);
}
}
}
}
결과
