본문 바로가기
알고리즘/백준

[백준] 2447 별찍기 -10

by 오오오니 2022. 8. 10.

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