문제
문제: 가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.
예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.
입력: 첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다
출력: 첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.
예제 입력:
3
3 7
15 7
5 2
예제 출력: 260
풀이
const fs = require('fs');
const input = fs.readFileSync(0, 'utf-8').trim().split('\n');
// 색종이 수
const n = Number(input[0]);
// 도화지 100 x 100 초기화
const paper = Array.from({ length: 100 }, () => Array(100).fill(0));
// 색종이 덮기
for (let i = 1; i <= n; i++) {
const [x, y] = input[i].split(' ').map(Number);
for (let row = y; row < y + 10; row++) {
for (let col = x; col < x + 10; col++) {
paper[row][col] = 1; // 덮은 부분에 1 마킹
}
}
}
// 넓이 계산
let area = 0;
for (let i = 0; i < 100; i++) {
for (let j = 0; j < 100; j++) {
if (paper[i][j] === 1) area++;
}
}
console.log(area);
풀이 해석
1. 표준입력을 줄단위로 나눠서 input에 배열로 저장한다.
2. input의 0번째 배열은 색종이의 개수이므로 변수 n에 저장한다.
3. 100x100 크기의 도화지를 만들고(Array.from({ length: 100 }) 전부 0으로 채운다(fill(0)).
4. 첫번째 for문 중 바깥쪽 for문: input의 1번째 배열 이후는 색종이 위치 이므로 숫자로 변환 후 변수 왼쪽x, 오른쪽y에 저장한다.
5. 첫번째 for문 중 안쪽 2중 for문: 색종이의 10x10 크기만큼 도화지 1을 칠한다.
6. 두번째 for문: 도화지 전체를 순회하면서 1의 개수를 구한다. 색종이가 실제 덮은 넓이 이다.
더 알아보기
1.
3중for문은 너무 어렵네....
'알고리즘 Node.js' 카테고리의 다른 글
백준 11005문제. 진법 변환2 (0) | 2025.04.04 |
---|---|
백준 2745문제. 진법 변환(일반수학1 시작!) (0) | 2025.04.03 |
백준 10798문제. 세로읽기 (0) | 2025.04.01 |
백준 2566문제. 최댓값 (0) | 2025.03.31 |
백준 2738문제. 행렬 덧셈(2차원 배열 시작!) (0) | 2025.03.30 |