# BOJ02448 별 찍기 - 11

https://www.acmicpc.net/problem/2448 (opens new window)

예제를 보고 규칙을 유추한 뒤 별을 찍는다.

#

n = 3인 경우

  * 
 * *
*****

n = 24인 경우

                       *                        
                      * *                       
                     *****                      
                    *     *                     
                   * *   * *                    
                  ***** *****                   
                 *           *                  
                * *         * *                 
               *****       *****                
              *     *     *     *               
             * *   * *   * *   * *              
            ***** ***** ***** *****             
           *                       *            
          * *                     * *           
         *****                   *****          
        *     *                 *     *         
       * *   * *               * *   * *        
      ***** *****             ***** *****       
     *           *           *           *      
    * *         * *         * *         * *     
   *****       *****       *****       *****    
  *     *     *     *     *     *     *     *   
 * *   * *   * *   * *   * *   * *   * *   * *  
***** ***** ***** ***** ***** ***** ***** *****

높이가 n일 때 밑변은 2 * n - 1이 된다. 또한 삼각형이 총 3개로 나눠지기 때문에 분할하여 그려간다.

private static void draw(int row, int col, int size) {
    if (size == 3) {
        map[row][col] = '*';

        map[row + 1][col - 1] = '*';
        map[row + 1][col + 1] = '*';

        map[row + 2][col - 2] = '*';
        map[row + 2][col - 1] = '*';
        map[row + 2][col] = '*';
        map[row + 2][col + 1] = '*';
        map[row + 2][col + 2] = '*';
        return;
    }a

    int newSize = size / 2;

    // 위 삼각형
    draw(row, col, newSize);
    // 아래 왼쪽 삼각형
    draw(row + newSize, col - newSize, newSize);
    // 아래 오른쪽 삼각형
    draw(row + newSize, col + newSize, newSize);
}

# 제출 코드

아래는 최종 제출 코드이다.

import java.util.Arrays;
import java.util.Scanner;

public class BOJ2448 {

    private static char[][] map;

    private static void draw(int row, int col, int size) {
        if (size == 3) {
            map[row][col] = '*';

            map[row + 1][col - 1] = '*';
            map[row + 1][col + 1] = '*';

            map[row + 2][col - 2] = '*';
            map[row + 2][col - 1] = '*';
            map[row + 2][col] = '*';
            map[row + 2][col + 1] = '*';
            map[row + 2][col + 2] = '*';
            return;
        }

        int newSize = size / 2;

        // 위 삼각형
        draw(row, col, newSize);
        // 아래 왼쪽 삼각형
        draw(row + newSize, col - newSize, newSize);
        // 아래 오른쪽 삼각형
        draw(row + newSize, col + newSize, newSize);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        map = new char[n][2 * n - 1];
        for (int i = 0; i < n; i++) {
            Arrays.fill(map[i], ' ');
        }

        draw(0, n - 1, n);

        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < 2 * n - 1; j++) {
                stringBuilder.append(map[i][j]);
            }
            stringBuilder.append("\n");
        }

        System.out.println(stringBuilder);
    }
}
#BOJ #분할 정복 #재귀
last updated: 11/19/2021, 11:09:25 PM