

다음은 마지막으로 별찍기 문제다.. 개인적으로 가장 머리가 아팠다.
1/3 씩 반복해서 재귀문도 돌려야하고, 값을 찍어내기도 해야하는데, 중간중간 비워두기까지 해야한다..
package test11;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Ox11_Q5_1 {
static int n;
static char[][] board;
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(br.readLine());
br.close();
// 보드판 세팅, 모든 공간을 공백으로 먼저 세팅
board = new char[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
board[i][j] = ' ';
}
}
// 메서드 호출
starFunc(0, 0, n);
// 계산 된 보드판 출력세팅 , 행마다 "\n" 추가
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sb.append(board[i][j]);
}
sb.append("\n");
}
System.out.println(sb.toString());
}
public static void starFunc(int x, int y, int n) {
if (n == 1) {
board[x][y] = '*';
return; // 재귀함수로 return
}
int newSize = n / 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
continue; // 중앙은 비워둔다.
}
// 재귀함수 호출, 지금 검사한 메소드 x * 3, y *3 좌표
starFunc(x + i * newSize, y + j * newSize, newSize);
}
}
}
}
우선 starFunc함수는 x(헹),y(열),n 을 인자로 받는다. Z문제 는 1/2씩 반복했다면,
이 문제는 1/3씩 반복한다.
점차 반복해서 제일 작은 블럭 (0,0,3)을 만들어 주고, 해당 구문이 반복해서 전체를 채워지게끔 하는 구조이다.
그 과정에서 가운데 부분은 공백이 와야하므로 i와 j 가 같은경우엔 contine 해준다.
참.. 백트래팅은 뭔가 머리론 얼추 이해하는데 손이 안따라주는 것 같다
어렵지만 꾸준히 해야겠다! 파이팅!
