작성일 :

문제 링크

8716번 - Pole

설명

축에 평행한 두 직사각형이 겹치는 영역의 넓이를 구하는 문제입니다.


접근법

두 직사각형이 겹치지 않는 경우를 먼저 확인합니다. 한쪽이 다른 쪽의 완전히 왼쪽, 오른쪽, 위쪽, 아래쪽에 있으면 겹치지 않습니다.

겹치는 경우에는 x축과 y축 각각에서 겹치는 구간의 길이를 구한 뒤 곱하여 넓이를 계산합니다.


Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;

struct Rectangle {
  public long x1, y1, x2, y2;
}

class Program {
  static bool IsOutOfBound(Rectangle r1, Rectangle r2) {
    return r1.x2 < r2.x1 || r2.x2 < r1.x1 || r2.y2 > r1.y1 || r1.y2 > r2.y1;
  }

  static void Main() {
    var a = Console.ReadLine()!.Split();
    var b = Console.ReadLine()!.Split();

    var r1 = new Rectangle {
      x1 = long.Parse(a[0]), y1 = long.Parse(a[1]),
      x2 = long.Parse(a[2]), y2 = long.Parse(a[3])
    };
    var r2 = new Rectangle {
      x1 = long.Parse(b[0]), y1 = long.Parse(b[1]),
      x2 = long.Parse(b[2]), y2 = long.Parse(b[3])
    };

    if (IsOutOfBound(r1, r2)) {
      Console.WriteLine(0);
      return;
    }

    var width = Math.Min(r1.x2, r2.x2) - Math.Max(r1.x1, r2.x1);
    var height = Math.Max(r1.y2, r2.y2) - Math.Min(r1.y1, r2.y1);
    var area = Math.Abs(width * height);
    Console.WriteLine(area);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

struct Rectangle {
  ll x1, y1, x2, y2;
};

bool isOutOfBound(const Rectangle& r1, const Rectangle& r2) {
  return r1.x2 < r2.x1 || r2.x2 < r1.x1 || r2.y2 > r1.y1 || r1.y2 > r2.y1;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  Rectangle r1, r2;
  cin >> r1.x1 >> r1.y1 >> r1.x2 >> r1.y2;
  cin >> r2.x1 >> r2.y1 >> r2.x2 >> r2.y2;

  if (isOutOfBound(r1, r2)) {
    cout << 0 << "\n";
    return 0;
  }

  ll width = min(r1.x2, r2.x2) - max(r1.x1, r2.x1);
  ll height = max(r1.y2, r2.y2) - min(r1.y1, r2.y1);
  ll area = abs(width * height);
  cout << area << "\n";

  return 0;
}