항상 별찍기 문제는 어려운것같다.

이 문제는 별을 찍는 패턴을 보면 3일때 찍는 것들이 연속적으로 있고, 꼭 3개씩 반복된다.

이런 문제는 재귀의 전형적인 문제라고 볼수있다. 그런데 패턴을 찾아내기가 여간 쉽지않았다.

그리고 처음부터 출력을 할려고 하니 막막했는데, 배열을 써서 배열에 넣을 생각으로 하니깐 할만 했던것같다.

소스코드는 제법 간단하다. n=3일때, 파라미터로 들어온 좌표를 갖고 배열의 값을 변경해준다.

그리고 파라미터들을 조합해서, 좌표들을 조정해서 다시 함수를 호출하는 방식이다.

#include <iostream>
#include <vector>

using namespace std;

const int MAX = 10000;
bool board[MAX][MAX];

void input_star(int n, int x, int y) {
	if (n == 3) {
		board[x][y] = true;
		board[x + 1][y - 1] = true;
		board[x + 1][y + 1] = true;
		for (int i = 0; i < 5; i++) {
			board[x + 2][y - i + 2] = true;
		}
		return;
	}

	input_star(n / 2, x, y);
	input_star(n / 2, x + n / 2, y - n/2 );
	input_star(n / 2, x + n / 2, y+n/2);
}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int input;
	cin >> input;

	for (int i = 0; i < input; i++) {
		for (int j = 0; j < 2 * input - 1; j++) {
			board[i][j] = false;
		}
	}
	input_star(input,0,input-1);
	
	for (int i = 0; i < input; i++) {
		for (int j = 0; j < 2*input-1; j++) {
			if (board[i][j]) cout << "*";
			else cout << " ";
		}
		cout << endl;
	}
}

+ Recent posts