본문 바로가기
백준 알고리즘

[JS]백준 2447번 별찍기-10

by 오늘의코더 2022. 7. 22.
반응형

출처

https://www.acmicpc.net/problem/2447

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

풀이

이 문제는 매우 접근하기 어려운 문제였다.
많은 시간 생각했지만 풀지 못해 블로그를 참고하였다.
https://chunghyup.tistory.com/m/68

[알고리즘] 백준 - 2447 별 찍기 - 10 해설, node js 구현

문제 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에

chunghyup.tistory.com


먼저 별을 저장할 배열을 만들고 printStar함수를 선언하였다. 이 함수에는 인풋으로 받은 3의배수가 들어간다. 이중 for루프를 돌면서 모든 좌표를 star함수에 넣어준다. (줄바꿈도 해줌)

스타라는 함수는 별아니면 공백을 찍는데, 공백이 생기는 규칙을 확인해 볼 필요가 있었다.

1. 공백은 (1,1)(1,4)(1,7) 등
i % 3 == 1 && j % 3 == 1 일때 생긴다.

2. 가운데 비어있는 공백을 해결해야 되는데 규칙을 찾아보면, 9일 때는 3,3에서 5,5까지 27일 때는 9,9부터 17,17까지가 공백이었다. 이를 3으로 나눈 값을 재귀로 돌리면 1,1이 되어 걸러지게 된다. (더 이해하면 추가하겠음)

코드

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const num = parseInt(input[0]);

const lines = [];

printStars(num);
console.log(lines.join(""));

function printStars(num) {
  for(let i = 0; i < num; i++) {
    for(let j = 0; j < num; j++) {
      star(i, j, num);
    }
    lines.push("\n");
  }
}

function star(i, j, num) {
  if (i % 3 === 1 && j % 3 === 1) {
    lines.push(" ");
  } else {
    if (num === 1) {
      lines.push("*");
    } else {
      star(parseInt(i / 3), parseInt(j / 3), parseInt(num / 3));
    }
  }
}



반응형

댓글