하루 알고리즘(JS)

[바미] 별 찍기 - 10

Bami 2024. 6. 15. 09:35
728x90
반응형

문제

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

 

코드

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim();
const N = parseInt(input, 10);

function generateStarPattern(size) {
    if (size === 1) {
        return ['*'];
    }

    const subPattern = generateStarPattern(size / 3);
    const pattern = [];

    for (let i = 0; i < size; i++) {
        pattern[i] = '';
        for (let j = 0; j < size; j++) {
            if (Math.floor(i / (size / 3)) % 3 === 1 && Math.floor(j / (size / 3)) % 3 === 1) {
                pattern[i] += ' ';
            } else {
                pattern[i] += subPattern[i % (size / 3)][j % (size / 3)];
            }
        }
    }

    return pattern;
}

const result = generateStarPattern(N);
console.log(result.join('\n'));

 

generateStarPattern(size) 함수는 재귀적으로 크기 size의 패턴을 생성해줍니다.

generateStarPattern(size) 함수의 동작 형태는 먼저 size === 1일 때 문자열 '*'를 반환해주고, 크기 size를 3등분하여, 가운데 부분이 공백인 패턴을 생성해줍니다. 그 후 subPattern은 크기 size / 3의 패턴을 저장하며, 이를 반복적으로 사용하여 전체 패턴을 생성해줍니다.

문제 해설

주어진 문제는 재귀적으로 패턴을 생성하여 별을 출력하는 문제입니다. 문제에서 제시한 조건을 바탕으로 재귀적인 접근을 통해 패턴을 생성해야 합니다.

 

𝑁 = 3 일 때의 기본 패턴은 아래와 같습니다.

***
* *
***

 

N이 3보다 클 경우, 크기 𝑁의 패턴은 가운데 부분이 공백으로 채워진 (𝑁 / 3) × (𝑁  / 3) 정사각형을 크기 𝑁 / 3의 패턴으로 둘러싼 형태로, 주어진 크기 𝑁에 대해 크기 𝑁 / 3인 패턴을 반복적으로 사용하여 생성하는 재귀 함수를 작성하여 문제를 풀었습니다.

시간 복잡도

시간 복잡도는 알고리즘이 입력의 크기에 따라 얼마나 빠르게 실행되는지를 나타냅니다

 

각 레벨에서 𝑁길이의 문자열을 3등분하여 처리합니다.

 

이 때 재귀 호출의 깊이는 \(\log _{3}\left( N\right)\)가 됩니다.

그리고 각 레벨에서 수행되는 작업의 총 합은 𝑁입니다.
따라서, 전체 시간 복잡도는 \(O\left( N\log _{3}\left( N\right) \right)\)이 됩니다.

공간 복잡도

공간 복잡도는 알고리즘이 얼마나 많은 메모리 공간을 사용하는지 나타냅니다.

 

재귀 호출의 깊이는 \(\log _{3}\left( N\right)\) 입니다.

각 호출 스택 프레임은 일정한 공간을 차지하므로, 총 공간 복잡도는 재귀 호출의 깊이에 비례합니다.

 

따라서 전체 공간 복잡도는 \(O\left( N\log _{3}\left( N\right) \right)\)이 됩니다.

 

728x90
반응형