백준 2447 : 별 찍기 - 10
문제 링크
문제 내용
재귀적인 패턴으로 별을 찍어보자. N이 3의 거듭제곱이라고 할 때, 크기 N의 패턴은 NxN 정사각형 모양이다.
크기 3의 패턴은 가운데 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)x(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다.
ex)
N이 9일 때,
N이 27일 때,
Idea
아래 코드를 짤 때, 기준점(x,y)부터 일정크기의 사각형으로 빈칸을 만드는 형식으로 작성하였다.
처음에는 한칸짜리(1x1)를 먼저 찾아 빈칸으로 만들고, 다음은 9칸(3x3), 그 다음은 81(9x9)...
+) 즉, 아래 코드는 빈칸을 만들 사각형의 왼쪽위 지점을 찾아 원하는 만큼 공백으로 채워주는 것이다.
(왜인지 이 글을 읽는 사람들이 늘어 조금이나마 보충설명을...ㅠ)
Code
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
|
#include <stdio.h>
#include <math.h>
char arr[2500][2500];
//모든 칸을 *로 채워주기
void AllStar(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
arr[i][j] = '*';
}
}
//지정된 점(x,y)부터 가로새로로 3^cnt만큼 공백으로 채우기
void Blank(int x, int y, int cnt) {
for (int i = x; i < x + (int)pow(3, cnt); i++) {
for (int j = y; j < y + (int)pow(3, cnt); j++) {
arr[i][j] = ' ';
}
}
}
//공백으로 지정할 점(x,y) 찾기
void Pivot(int n, int cnt) {
if (n > 0) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
//해당 기준점을 공백으로
Blank((int)pow(3, cnt) + i * (int)pow(3, cnt + 1),
(int)pow(3, cnt) + j * (int)pow(3, cnt + 1), cnt);
}
}
//기준점 이동하기
Pivot(n / 3, cnt + 1);
}
}
int main() {
int N;
scanf("%d", &N);
AllStar(N);
Pivot(N / 3, 0);
//결과출력
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
printf("%c", arr[i][j]);
printf("\n");
}
return 0;
}
|
cs |
'백준 Baekjoon' 카테고리의 다른 글
[C++] 백준 14501 : 퇴사 (0) | 2020.11.05 |
---|---|
[C언어] 백준 14881 : 물통 문제 (0) | 2020.11.04 |
[C언어] 백준 2875 : 대회 or 인턴 (0) | 2020.10.19 |
[C언어] 백준 1874 : 스택 수열 (0) | 2020.10.18 |
[C언어] 백준 2749 : 피보나치 수 3 (0) | 2020.10.10 |