백준 - 2448 별 찍기 11

Park Inhye·2024년 4월 12일
0

코테 연습

목록 보기
35/37

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

  • 첫째 줄
    • N

제한 사항

  • N은 항상 3×2k
  • 0 ≤ k ≤ 10, k는 정수

예시

// NOTE: 입력
24

// NOTE: 출력
                       *                        
                      * *                       
                     *****                      
                    *     *                     
                   * *   * *                    
                  ***** *****                   
                 *           *                  
                * *         * *                 
               *****       *****                
              *     *     *     *               
             * *   * *   * *   * *              
            ***** ***** ***** *****             
           *                       *            
          * *                     * *           
         *****                   *****          
        *     *                 *     *         
       * *   * *               * *   * *        
      ***** *****             ***** *****       
     *           *           *           *      
    * *         * *         * *         * *     
   *****       *****       *****       *****    
  *     *     *     *     *     *     *     *   
 * *   * *   * *   * *   * *   * *   * *   * *  
***** ***** ***** ***** ***** ***** ***** *****


해결

이전 별 찍기는 별을 다 채우기 > 구멍뚫기로 진행했다.
이번 별 찍기는 N X N 형태가 아니라서 분할할 범위를 유추해야했다.


보여지는 특징

  1. 반복되는 모양의 최소 단위는 5 X 3의 트리구조
  2. 전체 범위는 (2N - 1) X N

n X n 형태로 나눌 수 없으니까 잘라줄 개수와 특징을 찾아야 한다.


분할 범위

  1. 8등분으로 나눔
  2. 윗줄 트리구조 1개 + 아랫줄 트리구조 2개

보여지는 대로
3분할로 재귀를 돌리되,
시작점을 달리 주면 될 거 같다!

전체 범위의 시작점을 🔥[row, col]이라고 하자

전체 크기는 2N X N 다.
8등분한 박스의 크기는 N/2 X N/2 다.

3분할된 박스의 시작점은 다음과 같다.

  • 1️⃣[row, col + N/2]
  • 2️⃣[row + N/2, col]
  • 3️⃣[row + N/2, col + N]

별 찍기

이번 문제는 빈칸으로 채우기 > 별 채우기 방식으로 진행하면 된다!
재귀 돌리자!


전체 코드

const N = +require('fs').readFileSync('dev/stdin').toString().trim();

// NOTE: 반복되는 모양의 최소단위 5 X 3 >> 높이 3
const _tree = ['  *  ', ' * * ', '*****'];

// NOTE: 빈 배열 생성 (2*n - 1) X n
let _starArr = Array.from(Array(N), () => Array(2 * N - 1).fill(' '));

// NOTE: 별 찍기
const printStar = (n, row, col) => {
    // NOTE: n(높이)이 최소 높이인 경우, 별 찍음
    if (n == 3) {
        for (let i = 0; i < 3; i++) {
            for (let j = 0; j < 5; j++) {
                _starArr[row + i][col + j] = _tree[i][j];
            }
        }
        
        return;
    }
    
    // NOTE: 작은 트리 찾기
    // - 시작점은 [row, col]
    // - 8등분(가로 4 X 세로 2)으로 나눠주면
    // - 피라미드 모양으로 반복되므로 위에 하나, 아래 두개로 나뉨
    // - 첫 트리 시작점은 [row, col + n / 2];
    // - 두번째 트리 시작점 [row + n / 2, col];
    // - 세번째 트리 시작점 [row + n / 2, col + n];
    printStar(n / 2, row, col + n / 2);
    printStar(n / 2, row + n / 2, col);
    printStar(n / 2, row + n / 2, col + n);
    
}

printStar(N, 0, 0);

console.log(_starArr.map(v => v.join('')).join('\n'));

출처

백준 2448번: 별 찍기 - 11

profile
👁👄👁

0개의 댓글