2 분 소요

문제

백준 2448번 문제

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

입력

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

출력

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

예제 입력 1 복사

24

예제 출력 1 복사

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

풀이

인덱스 계산에 주의
KakaoTalk_20230626_172826631.jpg

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <bits/stdc++.h>
using namespace std;

char board[3500][7000];

void DrawStar(int row, int col, int height)
{
	//탈출문구
	//높이가 3이하면 가장 작은 삼각형을 그림
	if (height <= 3)
	{
		for (int i = 0; i < 3; ++i)
		{
			for (int j = -2; j < 3; ++j)
			{
				switch (i)
				{
				case 0:
					if (j == 0)
						board[row + i][col + j] = '*';
					break;
				case 1:
					if(j == -1 || j == 1)
						board[row + i][col + j] = '*';
					break;
				case 2:
					board[row + i][col + j] = '*';
					break;
				default:
					break;
				}
			}
		}
		return;
	}

	//height로 계산해야 현재 레벨에 관한 좌표계산 가능
	//가운데 삼각형, 왼쪽 삼각형, 오른쪽 삼각형	
	//Up
	DrawStar(row, col, height / 2);
	//Left
	DrawStar(row + height / 2, col - (height / 2), height / 2);
	//Right
	DrawStar(row + height / 2, col + (height / 2), height / 2);
}


int main()
{
    ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	int n;
	cin >> n;
	
	int temp = (n / 3);
	int width = (5 * temp) + (temp - 1); //n*2 - 1 도 가능
	int height = n;
	for (int i = 0; i < n; ++i)
		fill(board[i], board[i] + width, ' ');

	DrawStar(0, width / 2, n);
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < width; ++j)
		{
			cout << board[i][j];
		}
		cout << "\n";
	}
}

댓글남기기