[백준 2448번 C/C++] 별 찍기 - 11

 

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

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net


 

해결전략

 

Recursion, 재귀

fractal, 프랙탈 삼각형

 

 


 

정답 코드

 

#include <iostream>
#include <vector>
using namespace std;

int n;
vector<vector<char>> v;
char blank = ' ';
char star = '*';

void Tree(int y, int x) // 별 그리기, (y, x)는 별의 꼭짓점 위치
{
	// 첫번째 줄 (꼭직점에 * 1개)
	v[y][x] = star; 
	// 두번째 줄 (* 2개)
	v[y + 1][x - 1] = v[y + 1][x + 1] = star;
	// 세번째 줄 (* 5개)
	v[y + 2][x - 2] = v[y + 2][x - 1] = v[y + 2][x] = v[y + 2][x + 1] = v[y + 2][x + 2] = star; 

	return;
}

void Cal(int y, int x, int n)
{
	if (n == 3) {
		Tree(y, x); // n이 3이면 가장 작은 삼각형 별을 그림
		return;
	}
	
    // 현재 삼각형을 3개의 작은 삼각형으로 나누어 각각에 대해 별을 그림
	Cal(y, x, n / 2);				  // 위쪽 삼각형
	Cal(y + n / 2, x - n / 2, n / 2); // 왼쪽 아래 삼각형
	Cal(y + n / 2, x + n / 2, n / 2); // 오른쪽 아래 삼각형
}

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

	cin >> n;
	v.resize(n, vector<char>(n*2 - 1, ' ')); 
	
	Cal(0, n - 1, n); // 별을 그리는 함수 호출

	// 별 출력
	for (int y = 0; y < n; y++) {
		for (int x = 0; x < n*2 - 1; x++) {
			cout << v[y][x];
		}
		cout << "\n";
	}

	return 0;
}

 

 

가로를 n * 2로 설정하고 출력하면 안 된다.

가로를 정확히 n * 2  - 1로 해야 불필요한 빈칸이 출력되지 않아 정답이 된다.