https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
재귀 문제였다.
가운데 빈 공간을 어떻게 할까 고민했었는데
그냥 다 빈공간으로 초기화를 해주고 별을 찍어주면 되었다.
문제에서 제시한대로 n=3이 되면
"크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다."
이 모양을 배열에 넣어주었다.
n이 3이 아닐때에는 9등분으로 나누어서 함수를 호출해주었는데
N의 패턴 안에 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형이 있어야 하므로 가운데를 그리는 함수를 제외하고 8번 호출해 주었다.
#include<iostream>
using namespace std;
int N;
char star[3000][3000];
void recursion(int n,int y,int x)
{
if (n == 3)
{
for(int i=y;i<y+n;i++)
for (int j = x; j < x + n; j++)
{
if (i == y+1 && j == x+1)
{
continue;
}
//cout << i << " " << j << endl;
star[i][j] = '*';
}
return;
}
else
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (i == j&&i==1)
continue;
//cout << n / 3 << " " << i * n / 3 << " " <<j*n / 3 << endl;
recursion(n / 3, i*n / 3+y, j*n / 3+x);
}
}
}
}
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
star[i][j] = ' ';
recursion(N,0,0);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cout << star[i][j];
}
cout << "\n";
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준]1062 가르침 c++ (0) | 2022.08.19 |
---|---|
[백준] 15644 N과M(10) c++ (0) | 2022.08.16 |
[백준]1107 리모컨 c++ (0) | 2022.08.04 |
[백준] 10971 외판원 순회 2 c++ (0) | 2022.08.04 |
[백준] 1759 암호만들기 c++ (0) | 2022.07.08 |