https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

문제

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

입력

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

출력

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


처음에 예제 출력을 보자마자 프랙탈 도형이 생각났다.

그러니까 이런 거...?

처음에는 재귀적인 방법으로 결과를 바로 출력하게 만들고 싶었는데 내 머리로는 역부족이었다. 그래서 그냥 간단하게 동적할당으로 2차원 배열을 만들고 거기에 반복문으로 일일이 구멍을 뚫는(?) 방식으로 해결했다.


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char **arr;
	int a, i, j, b, x1, y1, x2, y2;
	scanf("%d", &a);
	arr = (char **) malloc(sizeof(char *) * a);
	for (i = 0; i < a; i++)
	{
		arr[i] = (char *) malloc(sizeof(char) * a);
		for (j = 0; j < a; j++)
		{
			arr[i][j] = '*';
		}
	}
	for (b = a / 3; b != 0; b /= 3)
	{
		for (x1 = y1 = b; ; x1 += 3 * b)
		{
			if (x1 >= a)
			{
				x1 = b;
				y1 += 3 * b;
				if (y1 >= a)
				{
					break;
				}
			}
			for (x2 = y2 = 0; ; x2++)
			{
				if (x2 >= b)
				{
					x2 = 0;
					y2++;
					if (y2 >= b)
					{
						break;
					}
				}
				arr[y1 + y2][x1 + x2] = ' ';
			}
		}
	}
	for (i = 0; i < a; i++)
	{
		for (j = 0; j < a; j++)
		{
			printf("%c", arr[i][j]);
		}
		printf("\n");
	}
	for (i = 0; i < a; i++)
	{
		free(arr[i]);
	}
	free(arr);
	return 0;
}

근데 자꾸 문제 분류가 재귀인데 재귀를 안 쓴다...? (그러니까 여러분들은 재귀를 멀리하고 반복을 가까이 하는 게 낫습니다) 뭔가 배열 말고 아름다운(?) 방식이 있을 거 같은데...

+ Recent posts