
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const inputs = fs.readFileSync(path).toString().trim().split('\r\n');
const n = Number(inputs[0]);
const recursive = (n) => {
if (n === 1) return ['*'];
const stars = recursive(n / 3);
const l = [];
for (const s of stars) {
l.push(s.repeat(3));
}
for (const s of stars) {
l.push(s + ' '.repeat(n / 3) + s);
}
for (const s of stars) {
l.push(s.repeat(3));
}
return L;
};
console.log(recursive(n).join('\n'));
⏰ 소요한 시간 : -
재귀 공부할때 풀려고 시도했다가 못풀었던 문제. 다시 봐도 감이 안와서 결국 풀이를 봤다.
요즘 코테 공부를 하면서 느끼는건데 결국 문제 유형은 정해져 있기 때문에 모르면 풀이를 보고 복습해서 내 것으로 만드는 것이 중요한 것 같다. 최소 200문제 이상..!
아무튼 n이 9일때를 예시로 들어보자면 re(9) -> re(3) -> re(1) 순서대로 재귀 호출이 된다.
re(1)에서 가장 첫 if문에 걸려 ['*']를 리턴하게 된다. 리턴값은 re(3)의 stars에 할당되고 이 stars만큼 반복을 하며 별을 찍어(정답배열에 푸시)준다.
re(3)에서 세번의 반복을 돌고나면 l 배열은 다음과 같은 상태가 될 것이다.
l = ['***', '* *', '***']
이 l을 리턴해주면 리턴값은 re(9)의 stars에 할당되고 다시 이 stars만큼 반복을 하며 별을 찍어준다.
re(9) 내부의 첫 반복문을 수행하면 l 배열은 다음과 같은 상태가 될 것이다
l = ['*********', '* ** ** *', '*********']
두 번째 반복문을 수행하면 l 배열은 다음과 같은 상태가 될 것이다
// 첫 반복문을 수행한 결과에 3개의 요소 추가
l = ['*********', '* ** ** *', '*********',
'*** ***', '* * * *', '*** ***']
마지막 반복문을 수행하면 re(9)일때의 결과를 얻을 수 있다.
// 두번째 반복문을 수행한 결과에 3개의 요소 추가
l = ['*********', '* ** ** *', '*********',
'*** ***', '* * * *', '*** ***',
'*********', '* ** ** *', '*********',]
마지막으로 해당 결과를 줄바꿈을 더해서 찍어주면 원하는 결과를 얻을 수 있다.