https://www.acmicpc.net/problem/1780
1780번: 종이의 개수
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수
www.acmicpc.net
작성한 코드
// 1780
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "Beakjoon/Silver/test.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const N = parseInt(input.shift(), 10);
const paper = input.map((row) => row.split(" ").map(Number));
const answer = [0, 0, 0];
const recursion = (x, y, size) => {
const target = paper[x][y];
let flag = true;
for (let i = x; i < x + size; i++) {
for (let j = y; j < y + size; j++) {
if (paper[i][j] !== target) {
flag = false;
break;
}
}
if (!flag) break;
}
if (flag) {
answer[target + 1]++;
} else {
const newSize = size / 3;
recursion(x, y, newSize);
recursion(x + newSize, y, newSize);
recursion(x + 2 * newSize, y, newSize);
recursion(x, y + newSize, newSize);
recursion(x + newSize, y + newSize, newSize);
recursion(x + 2 * newSize, y + newSize, newSize);
recursion(x, y + 2 * newSize, newSize);
recursion(x + newSize, y + 2 * newSize, newSize);
recursion(x + 2 * newSize, y + 2 * newSize, newSize);
}
};
recursion(0, 0, N);
console.log(answer.join("\n"));
📌 풀이
(1) 해당 구역이 전부 같은 숫자로 이루어져 있는지 확인한다.
해당 구역 내의 숫자 하나를 target으로 설정해서 배열 내 모든 숫자가 target과 일치하는지 확인한다. 그리고 일치하지 않다면 flag를 변경한다.
const target = paper[x][y];
let flag = true;
for (let i = x; i < x + size; i++) {
for (let j = y; j < y + size; j++) {
if (paper[i][j] !== target) { // 확인하기
flag = false;
break;
}
}
if (!flag) break;
}
(2) 만약 해당 구역이 전부 같은 숫자가 아니라면 9등분하고, 각 9개의 구역에서 (1)의 과정을 반복한다.
9등분이니까 현재 크기를 3으로 나누면 9등분한 값의 크기가 될 수 있다. x,y는 9등분 했을 시 시작점으로 설정해서 다시 재귀함수를 실행한다.
if (flag) {
answer[target + 1]++;
} else {
const newSize = size / 3;
recursion(x, y, newSize);
recursion(x + newSize, y, newSize);
recursion(x + 2 * newSize, y, newSize);
recursion(x, y + newSize, newSize);
recursion(x + newSize, y + newSize, newSize);
recursion(x + 2 * newSize, y + newSize, newSize);
recursion(x, y + 2 * newSize, newSize);
recursion(x + newSize, y + 2 * newSize, newSize);
recursion(x + 2 * newSize, y + 2 * newSize, newSize);
}
📌 참고
https://velog.io/@arthur/1780.-%EC%A2%85%EC%9D%B4%EC%9D%98-%EA%B0%9C%EC%88%98-node.js-javascript
1780. 종이의 개수 - node.js / javascript
1780. 종이의 개수 - node.js / javascript
velog.io
✅ 성공

'알고리즘 > 백준' 카테고리의 다른 글
| [JavaScript/재귀] 백준 실버 1: 1992 - 쿼드트리 (0) | 2024.01.30 |
|---|---|
| [JavaScript/재귀] 백준 실버 2 : 2630 - 색종이 만들기 (0) | 2024.01.30 |
| [JavaScript/재귀] 백준 실버 5 : 17478 - 재귀함수가 뭔가요? (0) | 2024.01.30 |
| [JavaScript/재귀] 백준 골드 5 : 11729 - 하노이 탑 이동 순서 (1) | 2024.01.30 |
| [JavaScript/재귀] 백준 실버 1 : 1629 - 곱셈 (2) | 2024.01.29 |