[백준] 2447 별찍기10
그동안 별찍기 문제 무시해왔던 나를 반성하게 한 문제…
프렉탈 같은거라 나름 재미있었다~!
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static char[][] d1; // 제일 기본 패턴, 3*3짜리
// n*n 짜리 그림을 2차원 배열로 반환하는 함수
static char[][] go(int n){
if(n == 3) { // 탈출조건
return d1;
}
int w = n/3; // n 짜리는 n/3짜리 꼬마그림 8개로 만들 수 있다(가운데 비움)
char[][] d = go(w); // 꼬마 그림 가져오기
char[][] res = new char[n][n]; // 도화지 세팅
for(int i = 0 ; i < n ; i++) {
Arrays.fill(res[i], ' '); // 공백으로 초기화
}
int cnt = 0; // 가운데 비울때 쓰이게 될 녀석(5번째를 건너뛰면 된다)
for(int i = 0 ; i <= n-w ; i += w) { // 패턴 시작 행 위치
for(int j = 0 ; j <= n-w ; j += w) { // 패턴 시작 열 위치
if(cnt == 4) { // 건너뛰는 조건 (가운데 비울때)
cnt++;
continue;
}
int xx = 0; // 꼬마 그림의 행
for(int k = i ; k < i+w ; k++ ) {
int yy = 0; // 꼬마 그림의 열
for(int l = j ; l < j+w ; l++ ) {
res[k][l] = d[xx][yy++]; // 도화지에 채워줍니다
}
xx++; // 꼬마 그림의 열 ++
}
cnt++;
}
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
char[][] ans = new char[n][n];
// 기본 패턴 만들기 (하드코딩 해버리는게 빠를듯)
d1 = new char[3][3];
for(int i = 0 ; i < 3 ; i++) {
Arrays.fill(d1[i], ' ');
}
Arrays.fill(d1[0], '*');
Arrays.fill(d1[2], '*');
d1[1][0] = d1[1][2] = '*';
ans = go(n); // 답 가져오기
// 출력
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < n ; i++) {
for(int j = 0 ; j < n ; j++) {
sb.append(ans[i][j]);
}sb.append("\n");
}
System.out.println(sb);
}
}
Comments