연습장/백준(BOJ) 문제풀이
[백준 2447 - Node.js] 별 찍기 - 10
Tesseractjh
2023. 1. 23. 16:27
🔗 문제 링크
https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
✏️ 풀이
const N = Number(require('fs').readFileSync('/dev/stdin').toString().trim());
const basicPattern = ['***', '* *', '***'];
const getPattern = (n) => {
if (n === 3) {
return basicPattern;
}
const prevPattern = getPattern(n / 3);
const topBottom = prevPattern.map(line => line.repeat(3));
const center = prevPattern.map(line => `${line}${' '.repeat(line.length)}${line}`)
return [...topBottom, ...center, ...topBottom];
};
console.log(getPattern(N).join('\n'));
N = 3일 때의 기본 패턴을 문자열을 3개 가진 배열로 정의한다.
getPattern 함수에서 N = 3일 때에는 기본 패턴을 반환한고, 그 외에는 재귀적으로 N / 3인 경우의 패턴(getPattern(N / 3))을 구하여 그 패턴을 위/아래 부분과 중간 부분으로 나누어 새 패턴을 만들어서 이어 붙인다. 위/아래는 기존 패턴을 3번씩 이어 붙인 모양이므로 각 문자열을 3번 반복한 형태로 변형하고, 중간은 기존 패턴을 양 옆에 한 번씩 반복후 가운데에는 빈 문자열이 있는 모양이므로 가운데에 문자열의 길이만큼의 공백을 두고 양 옆에는 문자열을 한 번씩 붙인 형태로 변형하였다. 그 다음 최종적으로 [위, 중간, 아래]의 형태로 다시 배열에 합쳐서 반환하여 더 큰 패턴을 완성하였다.