문제
https://www.acmicpc.net/problem/10994

풀이과정
의사 코드
크기 4*N-3인 정사각형을 시작으로, 내부에 한 칸씩 들어가며 더 작은 정사각형 테두리를 재귀적으로 그림.
더 이상 작게 그릴 수 없는 크기 N = 1이 되면 종료.
1. 입력값 N을 받는다.
2. 전체 정사각형의 크기를 size = 4 * N - 3 으로 계산한다.
3. size x size 크기의 2차원 배열을 생성하고, 모든 칸을 공백(' ')으로 초기화한다.
4. (0, 0)부터 시작하여 N 크기의 정사각형을 그리는 함수 drawStar(x, y, n)을 호출한다.
함수 drawStar(x, y, n)
- 현재 그릴 정사각형의 한 변의 길이를 size = 4 * n - 3 으로 계산한다.
- 상단 가로줄: (x, y) ~ (x, y + size - 1)까지 별('*')을 채운다.
- 하단 가로줄: (x + size - 1, y) ~ (x + size - 1, y + size - 1)까지 별('*')을 채운다.
- 좌측 세로줄: (x, y) ~ (x + size - 1, y)까지 별('*')을 채운다.
- 우측 세로줄: (x, y + size - 1) ~ (x + size - 1, y + size - 1)까지 별('*')을 채운다.
- 재귀 조건:
n이 1보다 크면, 내부에 또 다른 정사각형을 그릴 수 있으므로 drawStar(x + 2, y + 2, n - 1)을 호출한다.
(안쪽 정사각형은 바깥보다 2칸 안쪽에서 시작) 5. 모든 재귀가 완료되면, 배열의 각 행을 문자열로 만들어 한 줄씩 출력한다.
전체 코드
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
let result;
rl.on('line', (line) => {
const N = Number(line.trim());
const size = 4 * N - 3;
result = Array.from({ length: size }, () => Array(size).fill(' '));
drawStar(0, 0, N);
console.log(result.map(row => row.join('')).join('\n'));
rl.close();
});
function drawStar(x, y, n) {
let size = 4 * n - 3;
for (let i = 0; i < size; i++) {
// 정사각형 상하
result[x][y + i] = '*';
result[x + size - 1][y + i] = '*';
// 정사각형 좌우
result[x + i][y] = '*';
result[x + i][y + size - 1] = '*';
}
if (n > 1) {
drawStar(x + 2, y + 2, n - 1);
}
}'Algorithm' 카테고리의 다른 글
| [BOJ] 2346번: 풍선 터뜨리기 자바스크립트 풀이 (메모리 초과) (0) | 2025.07.08 |
|---|---|
| [BOJ] 22858번: 원상 복구 (small) 자바스크립트 풀이 (0) | 2025.06.22 |
| [BOJ] 5766번: 할아버지는 유명해! 자바스크립트 풀이 (2) | 2025.06.20 |