치춘 2022. 3. 18. 23:56

별 찍기 - 11

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

풀이

const recurStar = (n) => {
  if (n === 3) return ["  *  ", " * * ", "*****"];
  const ret = recurStar(n / 2);
  let arr = [];
  for (let j of ret) arr.push(" ".repeat(n / 2) + j + " ".repeat(n / 2));
  for (let j of ret) arr.push(j + " " + j);
  return arr;
};

const star = () => {
  let input = parseInt(
    require("fs").readFileSync("/dev/stdin").toString().trim()
  );
  console.log(recurStar(input).join("\n"));
};

star();

반성회

  1. 함수의 정의 : 현재 재귀 단계가 N일 경우, N / 2일 때의 삼각형 3개와 같은 크기의 역삼각형 공백 하나로 이루어진 큰 삼각형 만들기
  2. 종료조건: n이 3일 때 삼각형이 최소 크기를 가지므로 삼각형을 구성하는 문자열 배열 [" * ", " * * ", "*****"]을 반환
  3. 반환값:
    1. 하위 재귀 단계의 문자열 배열 반환값을 ret 변수로 받아온다 (얘를 반복해서 그려야 하므로)
      • 재귀 단계는 하위로 내려갈 때마다 n을 2로 나누며, (n은 3 * (2의 제곱수) 이므로) n이 3이면 더이상 2로 나눌 수 없으므로 재귀를 중단한다
    2. 현재 삼각형을 구성하는 각 줄을 담을 배열 arr 선언
      1. 첫 번째 삼각형 (위의 한 개) 은 이전 재귀 단계에서 받아온 삼각형에 좌우로 n / 2개의 공백을 더하여 arr 배열에 push
      2. 두 번째, 세 번째 삼각형은 이전 재귀 단계에서 받아온 삼각형 두 개를 가운데에 공백을 추가하여 좌우로 합쳐 arr 배열에 push
    3. 현재 재귀 단계에서의 배열 arr 반환 ⇒ 상위 재귀 단계에서 사용하거나, 그대로 출력
  4. 최종적으로 반환하는 배열은 그리고자 하는 삼각형의 각 줄에 해당하는 문자열들을 담고 있으므로, 개행으로 구분하여 출력