[백준 8716] Pole (C#, C++) - soo:bak
작성일 :
문제 링크
설명
축에 평행한 두 직사각형이 겹치는 영역의 넓이를 구하는 문제입니다.
접근법
두 직사각형이 겹치지 않는 경우를 먼저 확인합니다. 한쪽이 다른 쪽의 완전히 왼쪽, 오른쪽, 위쪽, 아래쪽에 있으면 겹치지 않습니다.
겹치는 경우에는 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;
}