[문제]
https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
[풀이]
n x n 사각형에 대해 가운데 부분이 공백으로 이루어지는 형태가 반복된다는 것을 알 수 있다. 따라서 이 때 어떤 좌표값이 공백이 되는지를 일반화해야 한다.
n이 3이면, (1, 1), (1, 4), (1, 7), (4, 1), (4, 4), (4, 7) 등의 좌표가 공백이 된다.
→ ( i / 1 ) % 3 == 1 && ( j / 1 ) % 3 == 1
n이 9이면, (3, 3), (3, 4), (3, 5), (4, 3), (4, 4), (4, 5), (5, 3), (5, 4), (5, 5) 등의 좌표가 공백이 된다.
→ ( i / 3 ) % 3 == 1 && ( j / 3 ) % 3 == 1
즉, ( i / ( n / 3 ) ) % 3 ==1 &&( j / ( n / 3 ) ) % 3 ==1 의 좌표값이 공백임을 일반화하여 나타낼 수 있다.
(i,j)의 값이 공백이라면 공백을 출력하고, 아니라면 n/3으로 크기를 줄여 재귀적으로 다시 탐색한다. n이 1로 줄여진 경우, 더이상 탐색이 불가능하므로 "*"를 출력한다.
[코드]
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
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(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for (int i=0; i<n; i++){
for (int j=0; j<n; j++){
star(i, j, n);
}
cout << "\n";
}
}