🧠 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;
}
반응형