블링블링 범블링

[백.단.풀.5] 별 찍기 - 11 (2448) 본문

알고리즘 문제풀이/백준

[백.단.풀.5] 별 찍기 - 11 (2448)

뻠스키 2019. 3. 12. 17:17
Step : <함수 사용하기>

Title : " 별 찍기 - 11 "


시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초128 MB3881119187332.155%

문제

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

입력

첫째 줄에 N이 주어진다. N은 항상 3*2^k 수이다. (3, 6, 12, 24, 48, ...) (k<=10)

출력

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

예제 입력 

24

예제 출력 

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



아... 난 이런 문제에 너무 취약하다.. 못푸는 건 아닌데 시간이 너무 많이 걸린다.


예전부터 공부를 해서 익숙해져야지 하는데 공부를 해도 시간이 많이 걸린다.


재귀함수를 사용하는 법은 아는데, 응용이 쉽게 머리 속에서 팍팍 안되는 느낌?


딱 그런 느낌이다. 많이 푸는 것이 답이라는 것을 아니까 더 많이 풀어봐야지~


(그리고 이 별찍기가 내가 여태 해봤던 별찍기 중 가장 어려운 난이도다 ㅋㅋㅋ)


이번 문제의 핵심은 2가지 이다.


1. 함수를 재귀적으로 호출 (재귀)

2. 가장 작은 삼각형을 여러번 그린다고 생각하기


이 두가지를 중점적으로 생각해서 해결하면 된다.


우선 나는 순차적으로 재귀를 해야된다고 생각했고, Tree의 Traversal 방법 중 Left->Right -> Mid 의 순회인


post-order 후위 순회 방법을 택해서 재귀를 구현했다.


가장 작은 곳 까지 내려간 다음, Left의 그림을 만들고, Right의 그림, Mid 의 그림, 그리고 그 다음 작은 곳으로 올라가면서 같은 동작을 반복하도록 구현하였다.


이런 문제는 정말 혼자 풀어봐야지만 실력이 향상되는 문제이다.


그런 의미에서 오늘도 화이팅!





코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
 
int N;
 
char star[3][7= { "  *   ",
                            " * *  ",
                            "***** " };
char board[4000][7000];
 
void startInsert(int startX, int endX, int startY, int endY)
{
    if (endX - startX < 6)
    {
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 6; j++)
                board[startX + i][startY + j] = star[i][j];
    }
    else
    {
        startInsert(startX + (endX - startX) / 2, endX, startY, startY + (endY - startY) / 2);
        startInsert(startX + (endX - startX) / 2, endX, startY + (endY - startY) / 2, endY);
        startInsert(startX, startX + (endX - startX) / 2, startY + (endY - startY) / 4,
 endY - (endY - startY) / 4);
    }
}
 
int main()
{
    scanf("%d"&N);
 
    // 별을 그릴 판(board)을 공백으로 초기화
    for (int i = 0; i <= N; i++)
        for (int j = 0; j <= N * 2; j++)
            board[i][j] = ' ';
 
    // 재귀 함수
    startInsert(0, N, 0, N * 2);
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j <= N * 2; j++)
            printf("%c", board[i][j]);
        printf("\n");
    }
 
    return 0;
}
 
cs


Comments