문제 링크




문제

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

입력

첫째 줄에 N이 주어진다. N은 항상 \(3\times2^{k}\) 수이다. (3, 6, 12, 24, 48, …) (0 ≤ k ≤ 10, k는 정수)

출력

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

예제 입력

24

예제 출력

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

코딩을 배우는 이유는 사실 콘솔창에 별을 멋지게 찍기 위해서가 아닐까?…




접근 과정

  1. 3줄짜리 작은 삼각형 모양을 잘 구성하여 높이가 N인 삼각형 모양을 만든다. 크기가 N인 삼각형은 크기가 (N - 1)인 삼각형 3개로 구성되어 있다. 여기서 재귀호출을 통해 구현하면 참으로 편하겠다 싶은 생각이 들었다.
  2. makeTriangleTower()는 높이가 N인 삼각형을 지정된 위치에 만드는 함수로 N-1 짜리 삼각형을 3개 만들도록 재귀호출을 수행한다. 각 삼각형이 위치해야할 적당한 좌표를 계산해준다면 완료. 호출시 쨔잔 하고 버퍼에 출력할 결과를 저장해준다.
  3. 동적메모리를 사용하지 않고 정적메모리를 사용해 구현해도 문제는 없다. 딱 맞는 버퍼 크기를 만들어야겠다 생각하다보니 이렇게 구현되었다 -_-;


소스 코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int N;
char triangle[3][5] = {
    "  *  ",
    " * * ",
    "*****"
};
char** buffer;

void makeTriangleTower(int size, int offsetX, int offsetY) {
    if (size == 3) {
        for (int i = 0; i < 3; ++i) {
            memcpy(buffer[offsetY + i] + offsetX, triangle[i], 5);
        }
        return;
    }

    int nextSize = size / 2;
    int nextWidth = nextSize * 2 - 1;
    makeTriangleTower(nextSize, offsetX + (nextWidth / 2) + 1, offsetY);
    makeTriangleTower(nextSize, offsetX, offsetY + nextSize);
    makeTriangleTower(nextSize, offsetX + nextWidth + 1, offsetY + nextSize);
}

int main(void) {
    scanf("%d", &N);

    int width = N * 2 - 1;    // (N / 3 * 6 - 1)

    buffer = malloc(sizeof(char*) * N);
    for (int i = 0; i < N; ++i) {
        buffer[i] = malloc(sizeof(char) * (width + 1));
        memset(buffer[i], ' ', sizeof(char) * (width + 1));
        buffer[i][width] = '\0';
    }

    makeTriangleTower(N, 0, 0);

    for (int i = 0; i < N; ++i) {
        puts(buffer[i]);
        free(buffer[i]);
    }
    free(buffer);
    return 0;
}