오늘의 코드

오늘의 코드. 11일차 (백준/2563번 색종이)

오늘의 코드 2024. 2. 14. 04:43
2차원 배열을 사용하는간단한 문제이다. 
Baekjoon / Problem No. 2536  (색종이)

 

Problem

가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

예를 들어 흰색 도화지 위에 세 장의 검은색 색종이를 그림과 같은 모양으로 붙였다면 검은색 영역의 넓이는 260이 된다.

Input

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100 이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다.

Output

첫째 줄에 색종이가 붙은 검은 영역의 넓이를 출력한다.


Solution 1

2차원 배열을 한 폭의 도화지로 생각해보자. (왠지 시적인 표현처럼 보인다.) 각 사각형의 크기는 10x10의 크기를 가지고 있다. 다만 이 사각형들이 중복되는 부분의 넓이는 빼야 한다.

 

굳이 그렇게 해야할까? 대수적으로 계산을 하려는 순간 머리가 복잡해진다.

문제의 조건은 도화지의 크기는 한변이 100인 정방형이다.

문제를 조금 축소시켜 널이가 10x10인 배열이 있다고 가정해보자. 

             
             
       
           
         
           
     
             
             
                   

 

다음과 같이 2차원 배열에 겹치는 부분들을 표시해주고, ■를 하나의 단위넓이(1x1)로 취급하여 ■의 개수를 세기만 하면 넓이가 구해진다. 한번 코드로 확인해 보자.


Code

#include <cstdio>

using namespace std;
int Paper[100][100] = {0};

int main()
{
    int ColoredPaper; // 색종이의 개수를 받는 변수
    int x, y;
    int a, b;
    int sum = 0; // 넓이의 합계
    scanf("%d", &ColoredPaper);

    for (int i = 0; i < ColoredPaper; i++)
    {
        scanf("%d %d", &x, &y);
        for (b = 0; b < 10; b++)
        {
            for (a = 0; a < 10; a++)
                Paper[a + x][b + y] = 1; // 마킹
        }
    }
    for (int c = 0; c < 100; c++)
    {
        for (int d = 0; d < 100; d++)
        {
            if (Paper[c][d] == 1)
            {
                sum += 1; // 단위넓이의 합계 계산
            }
        }
    }
    printf("%d", sum);
    return 0;
}

 


Review

정말 간단한 문제였다. 다만, 도화지의 크기 등 범위가 바뀌면 2차원 배열을 마킹하는 방식으로는 접근하는 것이 비효율적이므로 또 다른 프로세스를 사용해야할 지도 모른다.

 

사실 해외여행중이라 정말 간단한 문제를 고르고 고른건 비밀이다. 곧 영양가 높은 컨텐츠로 돌아오겠다.