예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
// NOTE: 입력
24
// NOTE: 출력
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
* * * * * * * *
* * * * * * * * * * * * * * * *
***** ***** ***** ***** ***** ***** ***** *****
이전 별 찍기는 별을 다 채우기 > 구멍뚫기로 진행했다.
이번 별 찍기는 N X N 형태가 아니라서 분할할 범위를 유추해야했다.
n X n 형태로 나눌 수 없으니까 잘라줄 개수와 특징을 찾아야 한다.
보여지는 대로
3분할로 재귀를 돌리되,
시작점을 달리 주면 될 거 같다!
전체 범위의 시작점을 🔥[row, col]
이라고 하자
전체 크기는 2N X N
다.
8등분한 박스의 크기는 N/2 X N/2
다.
3분할된 박스의 시작점은 다음과 같다.
1️⃣[row, col + N/2]
2️⃣[row + N/2, col]
3️⃣[row + N/2, col + N]
이번 문제는 빈칸으로 채우기 > 별 채우기 방식으로 진행하면 된다!
재귀 돌리자!
const N = +require('fs').readFileSync('dev/stdin').toString().trim();
// NOTE: 반복되는 모양의 최소단위 5 X 3 >> 높이 3
const _tree = [' * ', ' * * ', '*****'];
// NOTE: 빈 배열 생성 (2*n - 1) X n
let _starArr = Array.from(Array(N), () => Array(2 * N - 1).fill(' '));
// NOTE: 별 찍기
const printStar = (n, row, col) => {
// NOTE: n(높이)이 최소 높이인 경우, 별 찍음
if (n == 3) {
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 5; j++) {
_starArr[row + i][col + j] = _tree[i][j];
}
}
return;
}
// NOTE: 작은 트리 찾기
// - 시작점은 [row, col]
// - 8등분(가로 4 X 세로 2)으로 나눠주면
// - 피라미드 모양으로 반복되므로 위에 하나, 아래 두개로 나뉨
// - 첫 트리 시작점은 [row, col + n / 2];
// - 두번째 트리 시작점 [row + n / 2, col];
// - 세번째 트리 시작점 [row + n / 2, col + n];
printStar(n / 2, row, col + n / 2);
printStar(n / 2, row + n / 2, col);
printStar(n / 2, row + n / 2, col + n);
}
printStar(N, 0, 0);
console.log(_starArr.map(v => v.join('')).join('\n'));