[백준 | Javascript] 2447

박기영·2022년 7월 3일
1

백준

목록 보기
71/127

재귀. 4단계
2447번. 별 찍기 - 10

문제

2447번 문제 링크

solution

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

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글