3^k 제곱의 정사각형의 별을 찍는 문제이며 가운데가 뚤려 있는 형태의 모양을 출력
- 3^1 일 때의 패턴
***
* *
***
- 3^3 일 때의 패턴
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
let fs = require("fs");
let input = Number(fs.readFileSync("../input.txt").toString());
let str = "";
function star(i, j) {
if (i % 3 === 1 && j % 3 === 1) {
str += " ";
} else {
if (Math.floor(i / 3) === 0 && Math.floor(j / 3) === 0) {
str += "*";
} else {
star(Math.floor(i / 3), Math.floor(j / 3));
}
}
}
for (let i = 0; i < input; i++) {
for (let j = 0; j < input; j++) {
star(i, j);
}
str += "\n";
}
console.log(str.trim());
(i: 3, j:3)일 경우 i:1,j:1 로 함수 실행str에 더 해지게 된다.i,j가 3보다 크게 될 경우 다시 재귀를 통해 3으로 나눈 뒤 3보다 작았을 때 그 값의 나머지가 1일 경우 빈 칸으로 되고 나머지는 else문 안의 if문을 통해 *이 채워지는 방식이다.*로 패턴이 채워지는 형식이다. 이번 문제는 풀어나가기 어려워 참고 자료를 참조해서 이해하려는 노력을 하였다.
첫 문제를 풀어나갈 때에는 3^0의 패턴에서 3^1의 패턴을 각각 2차원 배열로 저장하고 다시 3^1의 패턴을 3^2의 패턴으로 이어붙혀 나아가는 방향으로 진입하였지만, 각 원소의 "\n"때문에 줄 바꿈 현상이 자주 일어나서, 찾아보면서 각 알고리즘을 이해하는 방향으로 공부를 진행하였다. 재귀는 매번 풀어도 복불복이다... 잘 풀리는 건 너무 잘 풀리지만, 어려운 건 난이도를 떠나 패턴을 찾아내지를 못하겠다...
참고자료