🧠 Algorithm/[C] BOJ

[C언어] 2447번 - 별 찍기 10

0_ch4n 2022. 4. 2. 13:52
반응형

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

***
* *
***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

출력

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

예제 입력 1

27

예제 출력 1

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

코드

#include <stdio.h>

void star(int i, int j, int n) { //return이 없기 때문에 void로 선언한다

    /*
    별과 공백이 반복되는 곳에서의 공백은 x, y좌표를 3으로 나눠보면 나머지가 1인걸 알 수 있다
    그렇기 때문에 i, j % 3 == 1을 통해 공백을 찾아줄 수 있다
    
    3의배수 X 3의배수의 사각형마다 가운데에 3의배수/3 X 3의배수/3 크기만큼의 공백이 있다
    n = 9를 예시로 보면 (3,3) (3,4) (3,5) (4,3) (4,4) (4,5) (5,3) (5,4) (5,5) 가 공백이다
    이것은 (i, j / 3) % 3 == 1을 통해 공백을 찾아줄 수 있다
    
    하지만 우리는 3^7까지 구해줘야하므로 (i, j / n) % 3 == 1을 이용하여 구한다
    이 때 전체 사각형에서 작은 사각형까지 좁혀가기 위해 조건문이 false일 경우 무조건 *을 출력하는게 아닌
    n / 3 == 0. 즉, 제일 작은 사각형까지 star(i, j, n / 3) 재귀함수를 통해 확인했을 때 *을 출력하게 한다
    */
    
    if((i / n) % 3 == 1 && (j / n) % 3 == 1) {
        printf(" ");
    }
    else {
        if(n / 3 == 0) {
            printf("*");
        }
        else {
            star(i, j, n / 3);
        }
    }
}

int main(void) {

    int n, h, w;

    scanf("%d", &n); //n 입력
    
    for(int i = 0; i < n; i++) { //0,0부터 n,n까지
        for(int j = 0; j < n; j++) {
            star(i, j, n); //그 좌표에 어떤게 들어갈지 판단해주는 함수
        }
        printf("\n"); //한 열이 끝났을 때 줄바꿈
    }

    return 0;
}
반응형