본문 바로가기

[C언어] 백준온라인/* 재귀

[C 언어] 백준 2447. 별 찍기 - 10


2447. 별 찍기 - 10 (누르면 해당 문제로 이동)

재귀적인 패턴을 재귀함수로 찍는 문제 1

 

제약사항)

시간 : 1 초

메모리 : 256 MB

 

문제)

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

 

입력)

첫째 줄에 N이 주어진다. N은 항상 3의 제곱꼴인 수이다. (3, 9, 27, ... ) (N=3^k, 1<=k<8)

 

출력)

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

 

입출력 예제

입력 출력
27

 


 

풀이 순서)

각 입력에 따른 규칙을 찾아야 하는 문제입니다.

 

규칙은 아래 그림과 같습니다.

빨간 테투리마다 N=1, N=3, N=9, N=27 일때 결과입니다. (초록색으로 *을 표현했습니다.)

규칙은 알았지만, 코드로 구현하기가 꽤나 까다로운 문제였다.

구글링을 통해 많은 블로그에서 풀이법과 코드를 보고 어떻게 구현되는지 이해할 수 있었습니다.

하지만, 혼자서 쉽게 생각하기 힘든 방법이었고, 공부할 겸 나름대로 스스로 해결해보기로 했습니다.

 

제가 구현한 코드의 규칙은 다음과 같습니다.

 

1. N을 입력받고, 나는 크기가 3일때 부터 빈칸이여야 하는 가운데를 지워나가기로 했습니다.

    N=9일 때에는 가운데 부분만 모두 지우고, 나머지 부분은 크기가 3인 블록의 값을 대입하도록 했습니다.

    아래 그림의 순서와 같이 동작하도록 코드를 구현했습니다.


효율성 등 여러 방면에서 보았을 때 타 블로그에 있는 다른 코드들이 훨씬 더 효율적일 것이라고 생각합니다.

스스로의 공부를 위해 작성한 코드이므로, 타 블로그를 참고하시면 더 짧고 쉬운 코드들을 많이 보실 수 있을 겁니다.:)

 


 

소스코드 및 결과 (C)

#include <stdio.h>

#define size 3000

char flags[size][size] = { NULL };

int star(int num, int n_num) {
	if (n_num == num*3)
		return 0;
	else {
		if (n_num==3) {
			for (int i = 0; i < num; i++) {
				for (int j = 0; j < num; j++) {
					if (i % 3 == 1 && j % 3 == 1)
						flags[i][j] = ' ';
					else
						continue;
				}
			}
		}
		else {
			for (int i = 0; i < num; i++) {
				for (int j = 0; j < num; j++) {
					if (n_num / 3 <= i && i < 2 * n_num / 3 && n_num / 3 <= j && j < 2 * n_num / 3)
						flags[i][j] = ' ';
					else
						flags[i][j] = flags[i % n_num][j % n_num];
				}
			}
		}
		star(num, n_num * 3);
	}
}

int main() {
	int N;

	scanf("%d", &N);

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

	star(N, 3);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			printf("%c", flags[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 

메모리 : 9900 KB

시간 : 268 ms

코드길이 : 895 B