본문 바로가기

Baekjoon/C++

[C++][BOJ/백준] 2669 직사각형 네개의 합집합의 면적 구하기

 

 

Baekjoon Online Judge

 

2669번: 직사각형 네개의 합집합의 면적 구하기

평면에 네 개의 직사각형이 놓여 있는데 그 밑변은 모두 가로축에 평행하다. 이 네 개의 직사각형들은 서로 떨어져 있을 수도 있고, 겹쳐 있을 수도 있고, 하나가 다른 하나를 포함할 수도 있으

www.acmicpc.net

 

 

[문제]

평면에 네 개의 직사각형이 놓여 있는데 그 밑변은 모두 가로축에 평행하다. 이 네 개의 직사각형들은 서로 떨어져 있을 수도 있고, 겹쳐 있을 수도 있고, 하나가 다른 하나를 포함할 수도 있으며, 변이나 꼭짓점이 겹칠 수도 있다.

이 직사각형들이 차지하는 면적을 구하는 프로그램을 작성하시오.

 

 

 

[입력]

입력은 네 줄이며, 각 줄은 직사각형의 위치를 나타내는 네 개의 정수로 주어진다. 첫 번째와 두 번째의 정수는 사각형의 왼쪽 아래 꼭짓점의 x좌표, y좌표이고 세 번째와 네 번째의 정수는 사각형의 오른쪽 위 꼭짓점의 x좌표, y좌표이다. 모든 x좌표와 y좌표는 1이상이고 100이하인 정수이다.

 

 

[출력]

첫 줄에 네개의 직사각형이 차지하는 면적을 출력한다.

 

 


 

[풀이]

해당 문제는 2차원 배열을 이용하면 간단하게 해결할 수 있다.

특정 위치에 직사각형이 없다면 값을 0으로,

직사각형이 있다면 값을 1로 생각하면 된다.

 

직사각형의 위치를 입력받고 이중 for문과 if문을 통해

해당 위치에 직사각형이 없다면(값이 0이라면) 1을 대입한 후,

직사각형들이 차지하는 면적을 나타내는 변수인 sum의 값을 1 증가시킨다.

 

 

[코드]

#include <iostream>
using namespace std;

int main()
{
    int x1, y1, x2, y2, sum = 0;
    int xy[100][100] = { 0 };

    for (int i = 0; i < 4; i++)
    {
        cin >> x1 >> y1 >> x2 >> y2;

        for (int j = x1; j < x2; j++)
        {
            for (int k = y1; k < y2; k++)
            {
                if (xy[j][k] == 0)
                {
                    xy[j][k] = 1;
                    sum++;
                }
            }
        }
    }

    cout << sum << '\n';

    return 0;
}