728x90
문제
https://www.acmicpc.net/problem/1030
프렉탈 평면은 다음과 같이 커진다. 시간 0에서 프렉탈은 흰색 정사각형 하나이다. 단위 시간(1)이 진행될 때마다 N×N개의 크기가 동일한 단위 정사각형으로 나누어진다. 만약 나누어진 정사각형이 흰색이라면 가운데 K×K 정사각형이 검정색으로 채워진다. N과 K는 둘 다 홀수이거나, 둘 다 짝수이다.
예를 들어, N=3, K=1이라면, 시간 1에 3×3 정사각형이 된다. 가운데 정사각형은 검정색이고, 나머지는 흰색이 된다. 시간 2때 9×9 정사각형이 되고, 17개는 검정이고, 나머지는 흰색이다.
s, N, K, R1, R2, C1, C2가 주어질 때, 시간 s일 때, R1행 C1열부터 R2행 C2열까지의 모습을 출력하는 프로그램을 작성하시오.
풀이
- 분할정복 문제
// 백준 - 프렉탈 평면(1030)
let s, N, K, R1, R2, C1, C2;
let answer;
const solution = ( input ) => {
[ s, N, K, R1, R2, C1, C2 ] = input.shift().split(' ').map((o) => parseInt(o));
answer = new Array(51).fill(0);
for(let i = 0; i < 51; i++) {
answer[i] = new Array(51).fill(0);
}
fractal(0, 0, Math.pow(N, s), false);
for(let i = 0; i <= R2 - R1; i++) {
let printLine = ""
for(let j = 0; j <= C2 - C1; j++) {
printLine += answer[i][j].toString();
}
console.log(printLine);
}
}
const fractal = ( x, y, size, isBlack ) => {
if(x > C2 || x + size <= C1 || y > R2 || y + size <= R1) return; // 범위 벗어나면 패스
// 분할 끝
if(size == 1) {
answer[y - R1][x - C1] = isBlack ? 1 : 0;
return;
}
let nextSize = size / N;
let black = [(N - K) / 2, N - (N - K) / 2];
for(let i = 0; i < N; i++) {
let nextY = y + nextSize * i;
for(let j = 0; j < N; j++) {
let nextX = x + nextSize * j;
fractal(nextX, nextY, nextSize, isBlack || (i >= black[0] && i < black[1])&& (j >= black[0] && j < black[1]));
}
}
}
/*
테스트용: __dirname + '/input.txt'
제출용: '/dev/stdin'
*/
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
solution(input);
728x90
'Programming > JavaScript' 카테고리의 다른 글
[백준/JavaScript] 거짓말(1043) (0) | 2024.08.17 |
---|---|
[백준/JavaScript] 두 용액(2470) (0) | 2024.07.28 |
[백준/JavaScript] RGB거리 2(17404) (0) | 2024.07.19 |
[백준/JavaScript] X와 K(1322) (0) | 2024.07.19 |
[백준/JavaScript] 고층 건물(1027) (0) | 2024.07.13 |