오늘의 문제는 “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;
}