알고리즘/백준 알고리즘

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

빠켱이 2020. 8. 1. 01:25

2448번 문제는 푸는 사람마다 여러 방법으로 풀 수 있지만 저는 재귀를 사용하였습니다.

위 그림처럼 같은 색 네모 안에 있는 모양이 반복된다고 생각했습니다. 따라서 각 네모의 가장 위에 있는 별의 좌표와 그 네모의 사이즈를 매개변수로 하여 재귀 함수를 만들었고 주황색 네모 사이즈가 나오면 해당 배열에 '*'이 들어가야 하는 부분에 별을 넣는 방식으로 함수를 만들었습니다.

초기 배열은 fill함수를 이용하여 공백으로 초기화하였습니다.

#include <iostream>
#include <algorithm>
using namespace std;
char arr[3100][6200];
void star(int x, int y, int z);
int main() {
	int N;
	scanf("%d", &N);
	fill(&arr[0][0], &arr[0][0] + 3100 * 6200, ' ');	//배열을 공백으로 초기화
	star(0, N - 1, N);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N * 2; j++) {
			printf("%c", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}
void star(int x, int y, int z) {
	if (z != 3) {
		star(x, y , z / 2);
		star(x + z / 2, y - z / 2, z / 2);
		star(x + z / 2, y + z / 2, z / 2);
	}
	else {
		arr[x][y] = '*';
		arr[x + 1][y - 1] = '*';
		arr[x + 1][y + 1] = '*';
		for (int i = -2; i <= 2; i++)
			arr[x + 2][y + i] = '*';
	}
}

혹시 코드에 오류가 없는데 틀렸다고 나오시는 분은 공백 출력에 유의해 주세요