
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const [N, ...inputs] = fs.readFileSync(path).toString().trim().split('\r\n');
const n = Number(N);
const input = inputs.map((it) => it.split(' '));
const answer = [0, 0, 0];
function checkPapar(x, y, n) {
const target = input[x][y];
for (let i = x; i < x + n; i++) {
for (let j = y; j < y + n; j++) {
if (target !== input[i][j]) return false;
}
}
return true;
}
function recursive(x, y, n) {
if (checkPapar(x, y, n)) {
answer[Number(input[x][y]) + 1] += 1;
return;
}
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
recursive(x + i * (n / 3), y + j * (n / 3), n / 3);
}
}
}
recursive(0, 0, n);
answer.forEach((it) => console.log(it));
어려워서 보고 푼 문제,,,, ㅠ
만약 종이 안에 써진 숫자가 다르다면 계속 9등분해서 확인해줘야 하므로 재귀함수로 구현해준다.
그 전에 종이 안에 써진 숫자가 같은지 아닌지 확인하는 checkPaper 함수를 만들어준다.
재귀함수에서는 사용할 수 있는 종이라면 재귀호출을 하지 않고 그 종이를 이룬 숫자가 무엇인지 체크해 answer의 크기를 증가해준다.
만약 사용할 수 없는 종이라면 9등분해서 다시 재귀호출을 해야하는데 for문을 중첩으로 사용해 종이의 시작좌표와 종이의 크기를 같이 전달하여 재귀호출한다.