🔗 문제
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
🖍 풀이
조각내서 출력하면 쉬운데 출력은 한 줄 단위라 애를 엄청 썼다. 그러다가 한 셀마다 공백' '인지, '*'을 찍을지 봐주게 되었다.
0, 0 | 0, 1 | 0, 2 |
1, 0 | 1, 1 | 1, 2 |
2, 0 | 2, 1 | 2, 2 |
패턴은 (1) 전체가 공백인 부분과 (2) N/3 패턴 부분으로 나뉜다.
(1) 공백으로만 채워지는 공간은 전체 패턴을 9조각 냈을 때 (1, 1) 에 해당한다.
(2) N/3 패턴으로 채워지는 공간은 (1, 1)을 제외한 모든 부분이다.
- N/3 패턴 또한 (1, 1)을 제외하면 '*'로 채워지게 된다.
- N/3으로 나누다가 N이 1이 된다면 더 이상 나눌 수 없다는 걸 의미한다.
- 공백 위치도 아니고 더 이상 나눌 수도 없다면 *의 위치다.
💾 소스
#include <iostream>
void draw(int r, int c, int n)
{
// 9조각 냈을 때, (1, 1) 즉, 정중앙에 있는 (r, c)는 공백
if((r/n)%3==1 && (c/n)%3==1)
{
std::cout << ' ';
}
else
{
// 더 이상 나눌 수도 없고, 공백의 자리도 아니다.
if(n == 1)
std::cout << '*';
else
// N/3 패턴에서 공백인지 아닌지 체크
draw(r, c, n/3);
}
}
int main()
{
int N=0;
std::cin >> N;
for(int i=0; i<N; ++i)
{
for(int j=0; j<N; ++j)
draw(i, j, N);
std::cout<<'\n';
}
}