N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다.
이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 작성하시오.
첫째 줄에 N(1 ≤ N ≤ 3^7, N은 3^k 꼴)이 주어진다. 다음 N개의 줄에는 N개의 정수로 행렬이 주어진다.
첫째 줄에 -1로만 채워진 종이의 개수를, 둘째 줄에 0으로만 채워진 종이의 개수를, 셋째 줄에 1로만 채워진 종이의 개수를 출력한다.
9
0 0 0 1 1 1 -1 -1 -1
0 0 0 1 1 1 -1 -1 -1
0 0 0 1 1 1 -1 -1 -1
1 1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0
0 1 -1 0 1 -1 0 1 -1
0 -1 1 0 1 -1 0 1 -1
0 1 -1 1 0 -1 0 1 -1
10
12
11
const fs = require('fs');
let [N, ...paper] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
N = Number(N);
for (let i = 0; i < N; i++) {
paper[i] = paper[i].trim().split(' ').map(Number);
}
let first = 0;
let second = 0;
let third = 0;
function Div(x, y, length) {
let start = paper[x][y];
let isAll = true;
for (let i = x; i < x + length; i++) {
for (let j = y; j < y + length; j++) {
if (start !== paper[i][j]) {
isAll = false;
break;
}
}
if (!isAll) break;
}
if (isAll) {
if (start === -1) first++;
else if (start === 0) second++;
else third++;
} else {
let newLength = length / 3;
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
Div(x + i * newLength, y + j * newLength, newLength);
}
}
}
}
Div(0, 0, N);
console.log(first);
console.log(second);
console.log(third);
이전에 풀었던 색종이 만들기에서 숫자만 바뀌었다. 문제를 보자마자 색종이 만들기 문제처럼 풀어야겠는데? 싶었는데 기억이 가물가물해서 색종이 만들기 문제를 다시 복습했다... 문제 한 번 풀면 복습 철저히.. 할 필요가 있다.