# 생각
삼각형 모양이기 때문에 배열 크기에 주의한다
패턴을 보면 작은 삼각형이 여러개를 이루는 프랙탈 구조를 가지고 있다
가장 작은 삼각형인 n = 3 일 때 차례로 저장해주고 종료해주면 된다
재귀식 역시 삼각형의 세 점을 기준으로 시작하기 때문에 x, y값을 좌표에 맞춰
3번 호출해 주면 구현할 수 있다.
# 전체 코드
#include <bits/stdc++.h>
using namespace std;
// 제한 : 1초, 256MB
// N = 3 * 2^k(0 <= k <= 10) --> 3 * 1024
char coord[3 * 1024][3 * 1024 * 2 - 1];
void PrintRecursive(int n, int x, int y)
{
// base condition은 3 * 2^k이기 때문에 제일 작은 삼각형인 3일 때
if (n == 3)
{
// 위부터 아래로 삼각형 모양
coord[x][y] = '*';
coord[x + 1][y - 1] = '*';
coord[x + 1][y + 1] = '*';
for (int i = y - 2; i <= y + 2; i++)
{
coord[x + 2][i] = '*';
}
return;
}
// 2의 거듭제곱이기 때문에 2로 계속 나눠준다
int num = n * 0.5;
// 3개의 삼각형이 세 점에서 시작하기 때문에 3번 함수 호출
PrintRecursive(num, x, y);
PrintRecursive(num, x + num, y - num);
PrintRecursive(num, x + num, y + num);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
fill(coord[i], coord[i] + N * 2 - 1, ' ');
}
PrintRecursive(N, 0, N - 1);
// 삼각형 출력을 위해 y 값은 0부터 2N - 1
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N * 2 - 1; j++)
{
cout << coord[i][j];
}
cout << '\n';
}
}
https://www.acmicpc.net/problem/2448
2448번: 별 찍기 - 11
첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)
www.acmicpc.net
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 15649_N과 M(1) with cpp (0) | 2022.01.31 |
---|---|
[BOJ] 14956_Philosopher's walk with cpp (0) | 2022.01.31 |
[BOJ] 2447_별 찍기 - 10 with cpp (0) | 2022.01.29 |
[BOJ] 1992_쿼드트리 with cpp (0) | 2022.01.28 |
[BOJ] 1780_종이의 개수 with cpp (0) | 2022.01.28 |