본문 바로가기

Algorithm/Problems

[JAVA]별 찍기 - 11(Baekjoon)

문제

입력

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

출력

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

예제 입력 1

24

예제 출력 1

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

풀이

Recursion으로 보인다. 바텀-업의 관점에서 쪼개본다면,

  *                        
 * *                       
*****

이러한 모양이 반복된다는 점을 알 수 있다. 따라서, atomic한 별이 위의 모양이고, 이를 level 0이라고 한다.

위 입력 24에서 level 3의 그림이 그려졌고 여기서 3은 $3×2^3=24$에서 지수 3이다.

2차원의 문자배열을 만들어 공백으로 채운 다음에, 별을 추가해주는식으로 구현한다.

x, y값을 넣어주고, level이 0이라면 채우는 식이다.

import java.io.*;
class _2448{
    public static char[][] arr;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = (int)(Math.log(Integer.parseInt(br.readLine()) / 3) / Math.log(2));
        arr = new char[(int)Math.pow(2, N)*3][(int)Math.pow(2, N)*6];
        for(int i = 0; i < arr.length; i++)
            for(int j = 0 ; j < arr[0].length; j++)
                arr[i][j] = ' ';
        star(0, arr.length-1, N);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j < arr[0].length; j++)
                sb.append(arr[i][j]);
            sb.append("\n");
        }
        System.out.println(sb);
    }
    static void star(int x, int y, int N){
        if (N == 0){
            for(int i = 0; i < 3; i++){
                for(int j = i; j < 5; j += i+1){
                    arr[y-i][x+j] = '*';
                }
            }
            return;
        }
        star(x, y, N-1);
        star(x + (int)Math.pow(2, N)*3, y, N-1);
        star(x + (int)Math.pow(2, N-1)*3, y - (int)Math.pow(2, N-1)*3, N-1);
    }
}

'Algorithm > Problems' 카테고리의 다른 글

[JAVA]합분해(Baekjoon)  (0) 2023.03.24
[JAVA]평범한 배낭(Baekjoon)  (0) 2023.03.21
[JAVA]특별상이라도 받고 싶어(Baekjoon)  (0) 2023.02.28
[JAVA]두 수의 합(Baekjoon)  (0) 2023.02.24
[JAVA]색종이(Baekjoon)  (0) 2023.02.24