본문 바로가기
알고리즘 Node.js

백준 2563문제. 색종이(어렵다,,,)

by 반갑조? 2025. 4. 2.

문제

문제: 가로, 세로의 크기가 각각 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문은 너무 어렵네....