# 생각
// PrintStar2
패턴은 가운데에 공백이 있고, 가운데를 제외한 전체는 별이기 때문에
base condition은 별을 넣어준다
N이 3보다 클 경우, 공백으로 채워진 가운데(N/3) * (N/3)의 정사각형을
N/3 패턴으로 둘러싼 형태이므로
재귀식에 가운데일 경우 continue로 제외해주고 3x3크기의 반복문으로 작성해 준다
// PrintStar1
가운데 부분만 비어있고 나머지는 채워져 있음을 알 수 있다. (1,1), (1,4), (1,7) ~
즉 j % 3 == 1일 때 공백임을 알 수 있다
동일하게 i % 3 == 1일 때도 공백이므로
base condtion은 (i / n) % 3 == 1 && (j / n) % 3 == 1 일 때 공백을 출력하고 탈출한다
재귀식은 빈칸 검사 후 빈칸이 아닌 경우 n/3으로 반복해 검사해 준다
나머지 3x3 구조에서 빈칸 조건이 만족하지 않을 때만 *을 표시해 주려면
n / 3 == 0 조건이 필요하다
# 전체 코드
#include <bits/stdc++.h>
using namespace std;
// 제한 : 1초, 256MB
// N^k K = 1~7 : 2187
// NULL 대신 공백문자가 있을 경우 불필요한 공백이 추가로 출력될 수 있다.
// 전역 변수 사용시 초기 값이 NULL
char coord[2200][2200];
void PrintStar2(int n, int x, int y)
{
if (n == 1)
{
coord[x][y] = '*';
return;
}
int divide = n / 3;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (i == 1 && j == 1)
{
continue;
}
PrintStar2(divide, x + i * divide, y + j * divide);
}
}
}
void PrintStar1(int n, int i, int j)
{
if ((i / n) % 3 == 1 && (j / n) % 3 == 1)
{
cout << ' ';
}
else
{
if (n / 3 == 0)
{
cout << '*';
}
else
{
PrintStar1(n / 3, i, j);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
// PrintStar2
for (int i = 0; i < N; i++)
{
fill(coord[i], coord[i] + N, ' ');
}
PrintStar2(N, 0, 0);
for (int i = 0; i < N; i++)
{
cout << coord[i] << '\n';
}
// PrintStar1
/*for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
PrintStar1(N, i, j);
}
cout << '\n';
}*/
}
https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 14956_Philosopher's walk with cpp (0) | 2022.01.31 |
---|---|
[BOJ] 2448_별 찍기 - 11 with cpp (0) | 2022.01.30 |
[BOJ] 1992_쿼드트리 with cpp (0) | 2022.01.28 |
[BOJ] 1780_종이의 개수 with cpp (0) | 2022.01.28 |
[BOJ] 2630_색종이 만들기 with cpp (0) | 2022.01.28 |