백준 Baekjoon

[C언어] 백준 2447 : 별 찍기 - 10

sujo 2020. 11. 2. 01:16

백준 2447 : 별 찍기 - 10

 

문제 링크

www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

 

문제 내용

재귀적인 패턴으로 별을 찍어보자. 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 / 30);
 
    //결과출력
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            printf("%c", arr[i][j]);
        printf("\n");
    }
    return 0;
}
cs