by CodeJin19
1 min read

Categories

Tags

오늘의 문제는 “2447번 별 찍기 - 10”.

이 문제는 틀리지 않고 한 번에 풀었기 때문에 엄밀히 말해 오답노트에 적을 문제는 아니다.

하지만 다른 사람들이 어떻게 풀었는지 한 번 보고 풀었기 때문에 오답노트에 적는다.

문제 형태를 보면 재귀함수를 사용해서 풀어야 할 것 같았다.

그래서 처음에는 재귀함수를 쓰면서 한 번에 한 줄씩, 왼쪽에서 오른쪽으로 출력해 나가는 함수를 만들려고 했다.

한참을 고치고 고치다가 처음으로 백준문제를 풀면서 검색을 했다.

다른 사람은 정사각형 배열을 만들어서 모든 칸을 ‘*‘로 채운다음 빈 공간을 찾아갔고,

나도 이런 방식으로 풀게 됐다.

#include <iostream>

using namespace std;

char fld[2200][2200];

void erase(int sx, int sy, int ex, int ey, int len)
{
	int d = len / 3;
	int msx = sx + d;
	int mex = msx + d;
	int msy = sy + d;
	int mey = msy + d;

	for (int i = msy; i < mey; i++)  //(sx, sy)부터 (ex, ey)까지의 가운데를 지움
	{
		for (int j = msx; j < mex; j++)
		{
			fld[j][i] = ' ';
		}
	}

	if (len != 3)  //len가 3이 아니라면 현재 정사각형을 9등분하여 
	{
		len /= 3;

		erase(sx, sy, sx + len - 1, sy + len - 1, len);
		erase(sx + len, sy, sx + len + len - 1, sy + len - 1, len);
		erase(sx + len + len, sy, ex, sy + len - 1, len);
		erase(sx, sy + len, sx + len - 1, sy + len + len - 1, len);
		erase(sx + len + len, sy + len, ex, sy + len + len - 1, len);
		erase(sx, sy + len + len, sx + len - 1, ey, len);
		erase(sx + len, sy + len + len, sx + len + len - 1, ey, len);
		erase(sx + len + len, sy + len + len, ex, ey, len);
	}
}

int main()
{
	int num;

	cin >> num;

	for (int i = 1; i <= num; i++)  //전체 칸에 '*'을 채우기
	{
		for (int j = 1; j <= num; j++)
		{
			fld[i][j] = '*';
		}
	}

	erase(1, 1, num, num, num);  //지우기 함수 호출 -> 재귀를 사용 모든 칸 지움

	for (int i = 1; i <= num; i++)  //배열 출력
	{
		for (int j = 1; j <= num; j++)
		{
			cout << fld[i][j];
		}

		cout << "\n";
	}

	cin >> num;

	return 0;
}