[백준2447_자바스크립트(javascript)] - 별 찍기 - 10

경이·2024년 8월 6일

𝑩𝑶𝑱 (𝒋𝒔)

목록 보기
109/325

🔴 문제

별찍기 - 10


🟡 Sol

const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const inputs = fs.readFileSync(path).toString().trim().split('\r\n');
const n = Number(inputs[0]);

const recursive = (n) => {
  if (n === 1) return ['*'];

  const stars = recursive(n / 3);
  const l = [];

  for (const s of stars) {
    l.push(s.repeat(3));
  }
  for (const s of stars) {
    l.push(s + ' '.repeat(n / 3) + s);
  }
  for (const s of stars) {
    l.push(s.repeat(3));
  }

  return L;
};

console.log(recursive(n).join('\n'));

🟢 풀이

⏰ 소요한 시간 : -

재귀 공부할때 풀려고 시도했다가 못풀었던 문제. 다시 봐도 감이 안와서 결국 풀이를 봤다.
요즘 코테 공부를 하면서 느끼는건데 결국 문제 유형은 정해져 있기 때문에 모르면 풀이를 보고 복습해서 내 것으로 만드는 것이 중요한 것 같다. 최소 200문제 이상..!

아무튼 n이 9일때를 예시로 들어보자면 re(9) -> re(3) -> re(1) 순서대로 재귀 호출이 된다.
re(1)에서 가장 첫 if문에 걸려 ['*']를 리턴하게 된다. 리턴값은 re(3)stars에 할당되고 이 stars만큼 반복을 하며 별을 찍어(정답배열에 푸시)준다.
re(3)에서 세번의 반복을 돌고나면 l 배열은 다음과 같은 상태가 될 것이다.

l = ['***', '* *', '***']

l을 리턴해주면 리턴값은 re(9)stars에 할당되고 다시 이 stars만큼 반복을 하며 별을 찍어준다.
re(9) 내부의 첫 반복문을 수행하면 l 배열은 다음과 같은 상태가 될 것이다

l = ['*********', '* ** ** *', '*********']

두 번째 반복문을 수행하면 l 배열은 다음과 같은 상태가 될 것이다

// 첫 반복문을 수행한 결과에 3개의 요소 추가
l = ['*********', '* ** ** *', '*********',
     '***   ***', '* *   * *', '***   ***']

마지막 반복문을 수행하면 re(9)일때의 결과를 얻을 수 있다.

// 두번째 반복문을 수행한 결과에 3개의 요소 추가
l = ['*********', '* ** ** *', '*********',
     '***   ***', '* *   * *', '***   ***',
     '*********', '* ** ** *', '*********',]

마지막으로 해당 결과를 줄바꿈을 더해서 찍어주면 원하는 결과를 얻을 수 있다.


🔵 Ref

https://cotak.tistory.com/38

profile
록타르오가르

0개의 댓글