백준_2447번

mingyu Lim·2023년 7월 1일

코딩테스트

목록 보기
23/32

문제 풀이

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());

설명

1. 중간 구멍

  • 들어오는 x,y축의 값의 나머지가 1일 경우 빈 구멍으로 나누어준다.
  • 3.재귀로 따졌을 때, 예를 들어 (i: 3, j:3)일 경우
    • (1. 중간 구멍, 2. 패턴)을 지나 다시 재귀로 i:1,j:1 로 함수 실행
    • 1번 조건문에 걸려 빈 칸이 str에 더 해지게 된다.
  • 위와 같은 형식으로 i,j가 3보다 크게 될 경우 다시 재귀를 통해 3으로 나눈 뒤 3보다 작았을 때 그 값의 나머지가 1일 경우 빈 칸으로 되고 나머지는 else문 안의 if문을 통해 *이 채워지는 방식이다.

2. 패턴

  • 3보다 작은 값으로 매개변수가 왔을 때 나머지가 1이 되지 않는 나머지 수들은 *로 패턴이 채워지는 형식이다.

3. 재귀

  • 만일 3보다 클 경우 매개변수를 3으로 나누어 재귀

회고

이번 문제는 풀어나가기 어려워 참고 자료를 참조해서 이해하려는 노력을 하였다.
첫 문제를 풀어나갈 때에는 3^0의 패턴에서 3^1의 패턴을 각각 2차원 배열로 저장하고 다시 3^1의 패턴을 3^2의 패턴으로 이어붙혀 나아가는 방향으로 진입하였지만, 각 원소의 "\n"때문에 줄 바꿈 현상이 자주 일어나서, 찾아보면서 각 알고리즘을 이해하는 방향으로 공부를 진행하였다. 재귀는 매번 풀어도 복불복이다... 잘 풀리는 건 너무 잘 풀리지만, 어려운 건 난이도를 떠나 패턴을 찾아내지를 못하겠다...
참고자료

0개의 댓글