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

6077 단어 C백준재귀C

진행 방식

어떻게 진행해야 할 지 몰라서 힌트를 받았다. n = 9라고 하면, 다 *로 채운 뒤 특정 조건에 공백처리하면 된다는 것이다.

*********
* ** ** *
*********
***   ***
* *   * *
***   ***
*********
* ** ** *
*********

이처럼 9 x 9 일때, 왼쪽 위 좌표를 0,0이라고 가정하자. 가운데에 뻥 뚫려있는 곳은 일단 내비두고 진행해보자. 그러면 나머지 빈칸은
1,1 4,1 7,1
1,4 공백 7,4
1,7 4,7 7,7
이렇게 나오는데, 규칙성으로 x % 3 == 1 && y % 3 == 1 이면 공백을 넣어주면 된다.
이제 가운데에 뻥 뚫려있는곳의 규칙을 찾아보면, x = 3, 4, 5, y = 3, 4, 5이다. n값을 3으로 나누고(n = 3) 그 n값을 넣어주면 x / n == 1, y / n == 1이라는 규칙이 나온다.

규칙을 다 구했으니 식을 작성하면 된다.

(x % 3 == 1 && y % 3 == 1) || (x / n == 1 && y / n == 1) 그래서 처음엔 이렇게 작성했는데, 코드가 이상하게 돌아가서 구글링을 해보았다.

결국 (x / n) % 3 == 1 && (y / n) % 3 == 1로 해주는 방식을 해주었는데, 코드를 보면서 진행해보자.

#include <stdio.h>

int star(int x, int y, int n)
{
	if ((x / n) % 3 == 1 && (y / n) % 3 == 1)
	{
		printf(" ");
	}
	else
	{
		if (n / 3 == 0) // 종료조건
			printf("*");
		else
		{
			star(x, y, n / 3); // 재귀
		}
	}
}

int main()
{
	int n, i, j;
	scanf("%d", &n);
	i = 0;
	while (i < n)
	{
		j = 0;
		while (j < n)
		{
			star(i, j, n);
			j++;
		}
		printf("\n");
		i++;
	}
}

재귀를 n / 3을 해주면서 진행하여 결국에는 공백을 넣을 수 있게 되었다.
https://hou27.tistory.com/entry/BaekjoonC%EC%96%B8%EC%96%B4-2447%EB%B2%88-%EB%B3%84%EC%B0%8D%EA%B8%B0-10 여기에서 도움을 많이 받았다.

좋은 웹페이지 즐겨찾기