백준 2448번 - 별 찍기 11
문제
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
입력
첫째 줄에 N이 주어진다. N은 항상 3×$2^k$ 수이다. (3, 6, 12, 24, 48, …) (0 ≤ k ≤ 10, k는 정수)
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 입력 1 복사
24
예제 출력 1 복사
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * * * * * *
* * * * * * * * * * * * * * * *
***** ***** ***** ***** ***** ***** ***** *****
풀이
인덱스 계산에 주의
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";
}
}
댓글남기기