재귀. 4단계
2447번. 별 찍기 - 10
const fs = require("fs");
const input = Number(fs.readFileSync("/dev/stdin").toString().trim());
let str = "";
function star (i, j) {
// i,j를 3으로 나눈 나머지가 1이라면 사각형의 가운데 있게되므로 공백 처리
if(i % 3 === 1 && j % 3 === 1){
str += " ";
} else {
// 위 조건과 관계없이 가운데 존재하는 (N/3)x(N/3) 정사각형은 공백이므로 예외 처리
if(Math.floor(i / 3) === 0 && Math.floor(j / 3) === 0){
str += "*";
} else {
// 예를 들어, 9x9 정사각형이라면
// (3,3) ~ (3,5), (4,3) ~ (4,5), (5,3) ~ (5,5)
// 해당 좌표들은 공백
star(Math.floor(i / 3), Math.floor(j / 3));
}
}
}
// 왼쪽 위, 즉, 문자열이 처음 찍히는 곳을 (0,0) 좌표라고 생각
// i는 한 줄을 의미
for(let i = 0; i < input; i++){
// j는 한 줄에 들어있는 한 칸을 의미
for(let j = 0; j < input; j++){
star(i, j);
}
// i가 바뀌기 전에 줄바꿈 처리를 해줌
str += "\n";
}
console.log(str);
솔직히 이 문제는 여러 풀이들을 참고해도 이해가 되지를 않는다.
다른 것보다 헷갈리면 안되는 것은, 문제 설명에서 3x3 정사각형의 형태를 보여주는 것으로 저걸 반복하면 되겠다는 생각을 할 수 있다.
그렇게 되면 3x3 정사각형이 아래로 이어지게 된다.
문자열의 특성을 제대로 생각한 뒤에 방법을 찾아야 헷갈리지 않을 것 같다.
그 후에, 반복되는 규칙을 찾아야하는데 개인적으로는 도저히 이해가 안되서 다른 분들의 풀이를 참고했다.
참고 풀이 1
참고 풀이 2