본문 바로가기
C++ 코딩 문제 풀이/백준

[Baekjoon] 2447번: 별 찍기 - 10

by 섬댕이 2023. 7. 24.

https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

 


 

문제 해결 과정

착안

메모리를 절약할 수 있는 더 좋은 방법이 있을 수 있지만, 간편한 방법으로 문제를 해결하고자 하였다. 프랙탈(fractal) 형태를 먼저 재귀적으로 구하여 저장한 다음, 한 행씩 문자열로 변환하여 출력해 문제를 해결하고자 하였다.

 

구현

프랙탈 모양의 형태를 최대한 적은 메모리를 사용해 저장해보려고 bool 형 배열을 이용해보았다. 별이 찍히는 부분을 true, 공백이 찍히는 부분을 false로 저장한 다음, 패턴을 모두 구하면 한 줄씩 문자열로 출력하였다.

 

[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~

더보기
#include <iostream>
#include <string>

using namespace std;

int N;
bool Pattern[2487][2487];

void MakePattern(int x, int y, int n)
{
	int len = n / 3;
	for (int i = y; i < y + n; i += len)
		for (int j = x; j < x + n; j += len)
			if (!(i == y + len && j == x + len))
			{
				if (len > 1)
					MakePattern(j, i, len);
				else
					Pattern[i][j] = true;
			}
}

void PrintStar()
{
	for (int i = 0; i < N; i++)
	{
		string str;

		for (int j = 0; j < N; j++)
			str += Pattern[i][j] ? "*" : " ";
		
		cout << str + "\n";
	}
	cout << "\n";
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	cin >> N;
	MakePattern(0, 0, N);
	PrintStar();
	return 0;
}

 

실행 결과

댓글