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

[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 메서드 사용했고
서치를 하긴 했지만 문제 패턴은 스스로 알아냈다는 점에서 만족한다 👍👍실버문제도 재귀가 어려웠는데 골드로 오니 확 어려워진 거 같다 ㅠㅠ