https://www.acmicpc.net/problem/2448
2448번: 별 찍기 - 11
첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)
www.acmicpc.net
프랙탈이란 일부분이 전체와 같은 모양을 가진 도형을 말한다.
예제를 아홉개의 사각형으로 나누면, 한가운데의 삼각형이 비어있고, 주변 세 삼각형 역시 가운데가 비어있으며, 그 구조가 각 삼각형에 대해서 반복되므로 프랙탈이라 볼 수 있다.
이 문제를 풀기 위해선 우선 가장 기본이 되는 N = 3 형태를 지정해준 뒤, N이 입력받은 값이 될 때까지 이전 형태를 복사해 저장하는 것으로 현재 형태를 만들면 된다.
#include <cstdio>
#define MAX_N 3 * 1024
// 계산의 편의를 위해 삼각형을 뒤집어서 저장
bool ans[MAX_N][2 * MAX_N] = {{ 1, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 1, 0, 0 },
{ 0, 0, 1, 0, 0, 0 }};
int main() {
// 삼각형의 높이
int N;
// 높이를 입력받은 뒤
scanf("%d", &N);
// 프랙탈의 크기가 주어진 크기가 될 때까지 프랙탈화 반복
for (int n = 3; n < N; n *= 2)
// 삼각형의 오른쪽과 위쪽 꼭지점에 기존 삼각형을 복제해 프랙탈 생성
for (int i = 0; i < n; i++) for (int j = 0; j < 2 * n; j++)
ans[i + n][j + n] = ans[i][j + 2 * n] = ans[i][j];
// 삼각형을 밑변부터 차례로 출력
for (int i = N - 1; i >= 0; i--) {
for (int j = 0; j < N * 2; j++) printf("%c", ans[i][j] ? '*' : ' ');
printf("\n");
}
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
2468번: 안전 영역 (0) | 2021.12.16 |
---|---|
2467번: 용액 (0) | 2021.12.16 |
2447번: 별 찍기 - 10 (0) | 2021.12.16 |
2446번: 별 찍기 - 9 (0) | 2021.12.16 |
2445번: 별 찍기 - 8 (0) | 2021.12.16 |