눈팅하는 게임개발자 블로그

백준 알고리즘 2448 본문

공부한거/백준알고리즘

백준 알고리즘 2448

Palamore 2017. 12. 22. 16:29



 

#include
#include
using namespace std;
char is_star[1024 * 3][1024 * 6];

void init(int n) {
	for (int i = 0; i < n; i++) {
		memset(&is_star[i][0],' ', (2 * n));
	}

}
int squaring(int n) {
	int a = 1;
	for (int i = 0; i < n; i++) {
		a = a * 3;
	}
	return a;
}
void star_tree(int p1, int p2) {
	is_star[p1][p2] = '*';   // 0 , 2
	is_star[p1 + 1][p2 - 1] = '*';
	is_star[p1 + 1][p2 + 1] = '*';
	for (int i = 0; i < 5; i++) {
		is_star[p1 + 2][p2 + i - 2] = '*';
	}
}
void spe_star(int n, int p1, int p2) {
	int temp1 = n / 2;
	if (n != 6) {
		spe_star(temp1, p1 - (n / 4), p2);
		spe_star(temp1, p1 + (n / 4), p2 - (n / 2));
		spe_star(temp1, p1 + (n / 4), p2 + (n / 2));
	}
	else {
		star_tree(p1 - 2, p2);
		star_tree(p1 + 1, p2 - 3);
		star_tree(p1 + 1, p2 + 3);
	}
}
void print_tmp(int n) {
	for (int i = 0; i < n; i++) {
		for (int k = 0; k < 2 * n - 1; k++) {
			cout << is_star[i][k];
		}
		cout << "\n";
	}
}
int main() {
	int n = 0;

	cin >> n;
	init(n);
	if (n == 3) {
		star_tree(0, 2);
	}
	else {
		spe_star(n, n / 2 - 1, n - 1);
	}
	print_tmp(n);
//	while (1);

	return 0;
}

}

가장 큰 삼각형의 중심위치를 좌표로서 시작점으로 점점 작은 단위의 삼각형으로 퍼져가는 재귀함수를 사용.
1 (가장큰 삼각형) -> 3 (2번째로 큰 삼각형) -> 9 (3번째로 큰 삼각형) ----
가장 작은 단위의 삼각형의 바로 앞단계의 삼각형(높이가 6인 삼각형)에 이를때까지 재귀함수를 반복해서 높이가 6인 삼각형의 중심위치에서 가장 작은 단위의 삼각형의 '*'를 입력해주기 위한 좌표 3개를 인자로 전달해서 가장 작은 단위의 삼각형의 위치를 모두다 입력해준다.

처음 설계시의 방법은 is_star의 배열을 bool타입과 int타입으로 선언했다. 이 방법은 3000*6000개가 넘는 배열을 하나하나 다 읽어줘야 해서 런타임 에러.
char타입으로 바꿔서 직접 ' '문자열과 '*'문자열을 is_star배열에 저장 후 바로 출력해줘서 해결.


'공부한거 > 백준알고리즘' 카테고리의 다른 글

백준 알고리즘 2108  (0) 2018.01.08
백준 알고리즘 10989  (0) 2018.01.05
백준 알고리즘 6064  (0) 2018.01.02
백준 알고리즘 2775  (1) 2017.12.29
백준 알고리즘 1316  (0) 2017.12.27