자료구조 & 알고리즘/코딩테스트

[JavaScript/코딩테스트] <백준 - 2447. 별 찍기 - 10>

칠구의 스터디 2025. 1. 8. 17:59

[Gold V] 별 찍기 - 10 - 2447

문제 링크

성능 요약

메모리: 24880 KB, 시간: 112 ms

분류

분할 정복, 재귀

문제 설명

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

  ***
  * *
  ***
  

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

 


 

[문제 이해하기] 

첨엔 무슨 소린가 이해가 되지 않았다...ㅜㅜ

사실 재귀 part에서 문제에 들어온거였기 때문에

반복되는 요소를 찾기 위해 노력했고

그래도 계속해서 보니까 반복되는 요소를 찾을 수 있었다

 

// n 이 3 일때

***
* *
***


// n 이 9 일때
*********
* ** ** *
*********
***   ***
* *   * *
***   ***
*********
* ** ** *
*********


// n 이 27 일때
***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
*********         *********
* ** ** *         * ** ** *
*********         *********
***   ***         ***   ***
* *   * *         * *   * *
***   ***         ***   ***
*********         *********
* ** ** *         * ** ** *
*********         *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
***   ******   ******   ***
* *   * ** *   * ** *   * *
***   ******   ******   ***
***************************
* ** ** ** ** ** ** ** ** *
***************************

 

문제가 3의 거듭제곱에다가 정사각형으로 진행되기 때문에

n이 3일때를 기준으로 상, 중, 하로 나누면 결국 중간 부분 가운데만 공백이 생겼다!!

 


[문제 풀이]

const input = require('fs')
  .readFileSync('/dev/stdin')
  .toString()
  .trim();

function starPrint(n) {
  if (n == 1) return ['*'];

  let star = starPrint(n / 3);
  let starList = [];

  // 상
  starList = starList.concat(...star.map(v => v + v + v));

  // 중간 (여기서 공백이 발생하기 때문에 push)
  starList.push(...star.map(v => v + ' '.repeat(star.length) + v));

  // 하
  starList = starList.concat(...star.map(v => v + v + v));

  return starList;
}

console.log(starPrint(Number(input)).join('\n'));

 

매개변수 n을 N/3씩 나누며 자기 자신인 starPrint() 함수를 호출하고 n이 1일 때 코드가 종료되는 재귀 함수이다

별은 상단과 하단을 기존 재귀 함수에서 이어 붙이고 중간에는 star의 길이만큼 공백을 넣어 반복하는 로직이다.

 

 

n이 9인 경우

 

n이 3일 때 starList =>  [ '***', '* *', '***' ]
n이 9일 때 starList =>  

[

'*********', '* ** ** *', '*********',

'***   ***', '* *   * *', '***   ***',  

'*********', '* ** ** *', '*********'

]

 

이런식으로 진행된다


[후기]

솔직하게 내 힘으로 풀지 못했고 파이썬 코드 문제 풀이를 보며 힌트를 얻고

문제를 풀 수 있었다...😢

문제 패턴을 알아내는 것도 오래 걸렸는데 코드는 생각보다 짧아서 허무했다...

 

그래도 평소 잘 안쓰던 재귀와 concat 메서드 사용했고

서치를 하긴 했지만 문제 패턴은 스스로 알아냈다는 점에서 만족한다 👍👍실버문제도 재귀가 어려웠는데 골드로 오니 확 어려워진 거 같다 ㅠㅠ