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

업데이트:

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, …)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.







입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.







출력

첫째 줄부터 N번째 줄까지 별을 출력한다.







예제 입력 1

27

예제 출력 1

enter image description here







알고리즘 [ 접근방법 ]

결론부터 말하면 내힘으로는 못풀었다. 재귀함수를 어떻게 활용해야 할지 감은 잡았지만 디테일한 부분을 생각해내지 못했다.. 처음에는 이중 for문을 활용해 3x3형태의 별을 출력한 뒤 가운데 구멍을 뚫고 for문에서 재귀함수를 활용해보려고 했는데 가운데 구멍을 뚫는 부분에 어떤 코드가 들어가야 할지 감이 안잡혔다.

그래서 구글링을 통해 가장 쉽고 간결하게 짜인 코드를 찾아봤는데 솔직히 아직도 잘 이해가 안간다.. 학교에서 알고리즘을 배울 때도 재귀함수는 진짜 이해가 안갔는데 역시나 어렵다..

자료를 찾아보니 재귀 + 분할정복(Divide and Conquer) 문제라고 하는데 좀더 알고리즘 공부를 한뒤 다시 풀어봐야 할 것 같다.

출처 : https://cryptosalamander.tistory.com/38

풀이

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


void star(int i, int j, int test) {

	if ((i / test) % 3 == 1 && (j / test) % 3 == 1) printf(" ");
	else {
		if (test / 3 == 0) printf("*");
		else star(i, j, test / 3);
	}
}



int main() {
	int num = 0;

	scanf("%d", &num);

	for (int i = 0; i < num; i++) {
		for (int j = 0; j < num; j++) {
			star(i, j, num);
		}
		printf("\n");
	}
	return 0;
}

댓글남기기