풀이 보관함
[C++] 백준 2447번: 별 찍기 - 10 본문
🔗 문제
🖍 풀이
조각내서 출력하면 쉬운데 출력은 한 줄 단위라 애를 엄청 썼다. 그러다가 한 셀마다 공백' '인지, '*'을 찍을지 봐주게 되었다.
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';
}
}