치춘짱베리굿나이스

[백준] 2448 본문

별 찍기 - 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. 최종적으로 반환하는 배열은 그리고자 하는 삼각형의 각 줄에 해당하는 문자열들을 담고 있으므로, 개행으로 구분하여 출력

'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글

[백준] 2338  (0) 2022.03.18
[백준] 1992  (0) 2022.03.18
[백준] 7287  (0) 2022.03.18
[백준] 6749  (0) 2022.03.18
[백준] 1463  (0) 2022.03.17
Comments