규칙을 찾아서 별 찍기(재귀)
3과 9일 때의 패턴을 출력해보고 27일 때로 접근하면 쉽다.
패턴을 어떻게 규칙적으로 찍어낼 수 있을까 고민해야 한다.
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
void star(int i, int j, int N) {
if ((i / N) % 3 == 1 && (j / N) % 3 == 1) // i / N: 반복되는 패턴을 만들기 위함.
cout << " ";
else {
if (N / 3 == 0)
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 << endl;
}
return 0;
}
3일 경우 패턴 만들기
i
와 j
라 하자i
와 j
가 1인 곳 if(i % 3 == 1 && j % 3 == 1)
cout << " ";
9일 경우 패턴 만들기
N/3
으로 나누었을 때의 몫이 1이면 된다.i
와 j
가 3,4,5인 곳if (i / (N/3) == 1 && j / (N / 3) == 1)
cout << " ";
27일 경우 패턴 만들기
i
와 j
가 <3, 4, 5>인 곳, <12, 13, 14>인 곳, <21, 22, 23>인 곳 [9일 때의 패턴 반복 구현 위해]
위의 방식을 그대로 넣고 돌리면 패턴이 반복되지 않는다. ==> 몫이 1~3이 나오므로
따라서, 몫이 1이 나오도록 해주어야 한다.
int main() { // N이 27일 때 패턴 반복이 되는지 확인하기 위한 예시
int N;
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i % 3 == 1 && j % 3 == 1)
cout << " ";
else if (i / (N/9) %3 == 1 && j / (N / 9)% 3 == 1) // N이 27일 때 이 조건으로 실행해보면 패턴 반복이 찍히는 것을 볼 수 있다.
cout << " ";
else
cout << "*";
}
cout << endl;
}
return 0;
}
재귀로 바꾸기
if (i / (N/9) %3 == 1 && j / (N / 9)% 3 == 1)
cout << " ";
(N/9)
부분을 N/3
으로 바꾸어 재귀를 하면 된다. (재귀로 호출하는 부분에 N/3
이라서 if문에는 N
만 들어감)N = N/3
이 되게 재귀적으로 들어가게 되므로 결국 N이 1로 변할 때, *
을 찍게 된다.void star(int i, int j, int N) {
if ((i / N) % 3 == 1 && (j / N) % 3 == 1) // i / N: 반복되는 패턴을 만들기 위함.
cout << " ";
else {
if (N / 3 == 0) // N이 1이되면 1 / 3 == 0 만족
cout << "*";
else
star(i, j, N / 3);
}
}
다 풀어놓고 몫을 1로 만들기
부분에서 끙끙댔다.
조금만 더 생각해보면 됐을 걸 아쉽다. (맨날 아쉬운 것 같기도...)
많이 풀다보면 척척 풀 수 있겠지