[JavaSrcipt] Baekjoon - 2447 : 별 찍기 - 10
문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제입력 | 예제출력 |
27 | ![]() |
3 | ![]() |
9 | ![]() |
❌ 풀이
팩토리얼과 피보나치는 단순하고 재귀가 이런거다 정도만 이해할수있는 수준이었는데
그걸 활용해서 기본수학과 합쳐지니 도저히 떠오르지않음..
결국 다른분의 풀이를 보고 한줄씩 이해하는 방법밖에 없다.
✅ 다른분의 풀이
const input=require('fs').readFileSync('/dev/stdin').toString().trim();
const lines = []
let num=Number(input);
printStars(num);
console.log(lines.join(""))
function printStars(num) {
for(let i = 0; i < num; i++) {
for(let j = 0; j < num; j++) {
star(i, j, num)
}
lines.push("\n")
}
}
function star(i, j, num) {
if(i % 3 == 1 && j % 3 == 1) {
lines.push(" ")
}else {
if(num == 1) {
lines.push("*")
} else {
star(parseInt(i/3), parseInt(j/3), parseInt(num/3))
}
}
}
num==1을 기반조건으로 볼 수 있을것같다.
첫 반복 i=0 j=0 num=27
star(0,0,27)이 된다.
if (i%3==1 && j%3==1) 불만족이므로
첫else에서 (num==1)불만족,
i j num을 3으로 나눈 정수값으로 star함수 재귀호출
0 0 9 위 단계 반복 모두 불만족 다시 재귀
0 0 3 다시재귀 0 0 1
num==1에 걸리게되어 "*"을 push한다.
가장큰 공백의 시작인 9,9로 예를들어보면
9 9 27 모두불만족
3 3 9 모두불만족
1 1 3 첫if문 만족 즉 " " 공백push
다음반복인
9 10 27도 마찬가지로 parseInt로 정수값이니 10도 3이되며
3 3 9 1 1 3 " "공백 push
이렇게 쭉 9,17,27 까지 공백이들어가게된다.
9 18 27은 3 6 9 재귀 1 2 3재귀 0 0 1이되므로 "*" push
즉 i의 값이 /3으로 재귀호출했을때 %3==1이 될수없다면 해당 행은 다 "*"이 push된다고 보면된다.
2 6 8 18 20 24 26 ---
찾아보다보니 기본적인문제라던데.. 미치겠네
-출처