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;
}
실행 결과
'C++ 코딩 문제 풀이 > 백준' 카테고리의 다른 글
[Baekjoon] 11404번: 플로이드 (0) | 2023.07.25 |
---|---|
[Baekjoon] 2293번: 동전 1 (0) | 2023.07.24 |
[Baekjoon] 18405번: 경쟁적 전염 (0) | 2023.07.21 |
[Baekjoon] 1541번: 잃어버린 괄호 (0) | 2023.07.17 |
[Baekjoon] 11053번: 가장 긴 증가하는 부분 수열 (0) | 2023.07.15 |
댓글