Algorithm/Baekjoon(Node.js)

[JavaSrcipt] Baekjoon - 2447 : 별 찍기 - 10

비망노트 2021. 10. 10. 21:09

문제

재귀적인 패턴으로 별을 찍어 보자. 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 ---

 

 

찾아보다보니 기본적인문제라던데.. 미치겠네

 

 

-출처

https://www.acmicpc.net/problem/2447