본문 바로가기
Algorithm/Java

[Java]백준 2448번 :: 별 찍기 - 11

by dev_mac-_- 2018. 7. 5.

문제

별찍는 규칙을 유추한 뒤에 별을 찍는다.

입력

첫째 줄에 N이 주어진다. (사용자 입력) n은 항상 3*2^k수이다.

출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
                       *                        
                      * *                       
                     *****                      
                    *     *                     
                   * *   * *                    
                  ***** *****                   
                 *           *                  
                * *         * *                 
               *****       *****                
              *     *     *     *               
             * *   * *   * *   * *              
            ***** ***** ***** *****             
           *                       *            
          * *                     * *           
         *****                   *****          
        *     *                 *     *         
       * *   * *               * *   * *        
      ***** *****             ***** *****       
     *           *           *           *      
    * *         * *         * *         * *     
   *****       *****       *****       *****    
  *     *     *     *     *     *     *     *   
 * *   * *   * *   * *   * *   * *   * *   * *  
***** ***** ***** ***** ***** ***** ***** *****
cs

 

문제풀이


* Java 언어로 구현했습니다.

 먼저 출력된 별 트리 모양을 보면 규칙을 발견할 수 있다. 

큰 삼각형기준으로 잡고 반으로 쪼개면 위 삼각형 1개, 아래 삼각형 2개가 나온다. 

 

첫번째로 재귀함수로 푼다면 간단하게 풀 수 있다는 것을 유추할 수 있다.

재귀함수의 대표문제 하노이 탑을 아래 그림과 같이 큰 단위에서 작은 단위로 쪼개면서 생각해보면 된다.

두번째로 높이는 n (사용자가 입력한 값) 가로는 2n -1인것을 알 수 있다.

이 범위를 가지는 2차원 배열을 선언해서 * 값이 해당되지 않는 부분은 공백을 채워둔다.

import java.util.Scanner;

public class beack_2448 {
    private static char[][] map;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        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] = ' ';
        
        drawStar(0, n-1, n);
        
        for (int i = 0; i<n; i++) {
            for (int j = 0; j < 2*n-1; j++)
                System.out.print(map[i][j]);
            System.out.println();
        }
    }

    private static void drawStar(int x, int y, int n) {
        if (n == 3) {
            map[x][y] = '*';
            map[x + 1][y - 1] = map[x + 1][y + 1] = '*';
            map[x + 2][y - 2] = map[x + 2][y - 1] = map[x + 2][y] = map[x + 2][y + 1] = map[x + 2][y + 2] = '*';
            return;
        }

        drawStar(x, y, n / 2);
        drawStar(x + n / 2, y - n / 2, n / 2);
        drawStar(x + n / 2, y + n / 2, n / 2);
    }
}

댓글