[C++] 2447: 별 찍기 - 10

쩡우·2023년 1월 10일
0

BOJ algorithm

목록 보기
26/65

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.



N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

예제 입력 1

27

예제 출력 1

***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
*********         *********
* ** ** *         * ** ** *
*********         *********
***   ***         ***   ***
* *   * *         * *   * *
***   ***         ***   ***
*********         *********
* ** ** *         * ** ** *
*********         *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************

풀이

0 ~ n까지의 모든 좌표를 재귀함수를 이용하여 판별하고, 출력한다.

만약 해당 좌표가 n x n 중에서 가운데 큰 구멍이라면(예를 들어, n = 27일 때, [9 ~ 17][9 ~ 17]좌표 범위) 다음 조건을 만족한다.

(i / (n / 3)) % 3 == 1 && (j / (n / 3)) % 3 == 1

해당 범위에 포함된다면, 빈칸을 출력한다.

해당 범위에 포함되지 않는다면, n / 3하여 다시 재귀한다.

n이 3씩 나뉘어져 1에 도달한다면, 더 이상 판별할 필요가 없으므로 *을 출력한다.

코드

#include <iostream>

using namespace std;

void recursion(int, int, int);

int main(void)
{
	int n;
	cin >> n;

	int i = -1;
	while (++i < n)
	{
		int j = -1;
		while (++j < n)
			recursion(i, j, n);
		cout << '\n';
	}

	return (0);
}

void recursion(int i, int j, int n)
{
	if (n == 1)
		cout << '*';
	else if ((i / (n / 3)) % 3 == 1 && (j / (n / 3)) % 3 == 1)
		cout << ' ';
	else
		recursion(i, j, n / 3);

	return ;
}

딩동댕~

profile
Jeongwoo's develop story

0개의 댓글