[백준] 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);
  }

}

Tags:

Categories:

Updated:

Comments