궤도

[백준] 2447번 : 별찍기 - 10 본문

💻 현생/⛓ 알고리즘

[백준] 2447번 : 별찍기 - 10

영이오 2020. 10. 15. 21:05

문제

 


풀이

 

지금까지 봐온 별찍기 문제 중에서 가장 어려웠다. 바로 출력하는건 정말 어려울 것 같아서 배열을 만들었다. 재귀함수를 돌리며 배열에 적당히 값을 넣어주고 한번에 출력하면 될 것 같았다. 배열을 9등분 한다고 했을 때, 가운데를 제외한 모든 구역에 대해 재귀함수를 호출한다. 배열의 크기가 1x1이 되면 호출을 끝내면 될 것이다. 어차피 가운데에 대해서는 함수가 호출되지도 않을테니 바로 별을 넣어주면 된다. 재귀함수의 인자로는 뭐가 있으면 될까. 전체 배열, 부분 배열의 왼쪽 맨위 좌표, 부분 배열의 크기를 넣으면 된다.


소스코드

 

#include <iostream>
#include <memory.h>
using namespace std;

void star(char** matrix, int x, int y, int n) {
	if (n == 1)
		matrix[x][y] = '*';
	else {
		for (int i = x; i < x + n; i += (n / 3)) {
			for (int j = y; j < y + n; j += (n / 3)) {
				if (i != (x + (n / 3)) || j != (y + (n / 3)))
					star(matrix, i, j, n / 3);
			}
		}
	}
}

int main() {
	int N;
	cin >> N;
	char** matrix = new char* [N];
	for (int i = 0; i < N; i++)
		matrix[i] = new char[N];

	for (int i = 0; i < N; i++)
		for (int j = 0; j < N; j++)
			matrix[i][j] = ' ';

	star(matrix, 0, 0, N);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++)
			cout << matrix[i][j];
		cout << '\n';
	}
}
Comments