알고리즘/[ Baekjoon ]

[ BOJ ][JAVA][2448] 별 찍기 - 11

kim.svadoz 2021. 4. 22. 23:58
반응형

www.acmicpc.net/problem/2448

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 23016 9008 6308 37.301%

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

예제 입력 1

24

예제 출력 1

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

코드

import java.io.*;
import java.util.*;

public class p2448 {
    static int N;
    static char[][] map;
    static BufferedReader br;
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        map = new char[N][2 * N - 1];
        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < 2 * N - 1; ++j) {
                map[i][j] = ' '; // 공백문자로 초기화
            }
        }

        printStar(0, N - 1, N);

        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < 2 * N - 1; ++j) {
                sb.append(map[i][j]);
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }

    // 분할정복 알고리즘
    static void printStar(int r, int c, int n) {
        // 패턴의 가장 작은 단위인가?
        if (n == 3) {
            map[r][c] = '*';
            map[r + 1][c - 1] = map[r + 1][c + 1] = '*';
            map[r + 2][c - 2] = map[r + 2][c - 1] = map[r + 2][c] = map[r + 2][c + 1] = map[r + 2][c + 2] = '*';
            return;
        }

        // 가장 작은 단위가 아니라면 더 작은 단위로 쪼개기
        int len = n / 2;
        // 그리고 그 단위의 가장 꼭대기 * 좌표로 재귀 호출
        printStar(r, c, len);
        printStar(r + len, c - len, len);
        printStar(r + len, c + len, len);
    }
}
반응형