예지의 개발 로그포스 (Yeji's Log Force)

[BOJ][C++] 백준 2447 별찍기 -10 본문

CS/Algorithm & Data Structure

[BOJ][C++] 백준 2447 별찍기 -10

Yeji Heo 2022. 11. 22. 15:21

머리가 팽팽 돌아가지 않는 것을 자각한 문제다 후...

 

어디를 공백으로 둘 건가에 초점을 맞추는 게 좋은 것 같다.

어느 좌표들이 공백인지 규칙성을 찾는 것이다.

 

9*9그림을 그려보면 (1,1),(1,4),(1,7),(4,1),(4,4),(4,7) 처럼

x좌표%3==1 && y좌표%3==1

인 곳들이 공백이었다.

 

더 나아가 큰 패턴으로 보았을 때, 패턴상의 가운데 부분이 비게 되고 이 부분을 생각해보면

x좌표/(n/3) % 3 ==1 && y좌표/(n/3) % 3 == 1

인 곳들이 공백이었다.

 

1,1~n,n각 좌표를 반복문으로 방문할 거고 공백부분을 위의 규칙으로 비워줄거다.

이걸 n을 계속 쪼개줘가면서 3*3패턴까지 반복 그리게 할 것이고, 그 후에 또 재귀함수가 한번 더 쪼개면 n==1이 되므로

더 이상 찾을 공백이 없다. ==> "*"을 찍어준다.

#include <iostream>
using namespace std;

void star(int i, int j, int N) {
	if (N == 1) {
		cout << "*";
	}
	else if (i / (N / 3) % 3 == 1 && j / (N / 3) % 3 == 1) { //공백 체크
		cout << " ";
	}
	else {
		star(i, j, N / 3);
	}
}

int main()
{
	int N;
	cin >> N;

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			star(i, j, N);
		}
		cout << "\n";
	}
}
Comments