[백준 15973] 두 박스 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
두 직사각형의 좌하단과 우상단 좌표가 주어질 때, 두 직사각형의 교차 상태를 판정하는 문제입니다. 면적이 겹치면 FACE, 한 변만 겹치면 LINE, 한 점만 겹치면 POINT, 전혀 겹치지 않으면 NULL을 출력합니다.
접근법
x축과 y축 각각에서 두 구간의 교집합 상태를 구합니다. 각 축에서 구간이 떨어져 있으면 0, 한 점에서 만나면 1, 겹치면 2로 표현합니다.
두 구간의 교집합 상태를 구할 때는 먼저 시작점이 작은 구간을 왼쪽에 배치합니다. 왼쪽 구간의 끝점이 오른쪽 구간의 시작점보다 작으면 떨어져 있고, 같으면 한 점에서 만나고, 크면 겹칩니다.
x축과 y축의 상태를 조합하여 결과를 판정합니다. 둘 중 하나라도 0이면 NULL, 둘 다 2이면 FACE, 둘 다 1이면 POINT, 그 외는 LINE입니다.
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
using System;
class Program {
static int Intersect(long a1, long a2, long b1, long b2) {
if (a1 > b1) { (a1, b1) = (b1, a1); (a2, b2) = (b2, a2); }
if (a2 < b1) return 0;
if (a2 == b1) return 1;
return 2;
}
static void Main() {
var s1 = Array.ConvertAll(Console.ReadLine()!.Split(), long.Parse);
var s2 = Array.ConvertAll(Console.ReadLine()!.Split(), long.Parse);
var x1a = s1[0]; var y1a = s1[1]; var x2a = s1[2]; var y2a = s1[3];
var x1b = s2[0]; var y1b = s2[1]; var x2b = s2[2]; var y2b = s2[3];
var dx = Intersect(x1a, x2a, x1b, x2b);
var dy = Intersect(y1a, y2a, y1b, y2b);
var res = "";
if (dx == 0 || dy == 0) res = "NULL";
else if (dx == 2 && dy == 2) res = "FACE";
else if (dx == 1 && dy == 1) res = "POINT";
else res = "LINE";
Console.WriteLine(res);
}
}
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
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int inter(ll a1, ll a2, ll b1, ll b2) {
if (a1 > b1) { swap(a1, b1); swap(a2, b2); }
if (a2 < b1) return 0;
if (a2 == b1) return 1;
return 2;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2;
ll X1, Y1, X2, Y2; cin >> X1 >> Y1 >> X2 >> Y2;
int dx = inter(x1, x2, X1, X2);
int dy = inter(y1, y2, Y1, Y2);
if (dx == 0 || dy == 0) cout << "NULL\n";
else if (dx == 2 && dy == 2) cout << "FACE\n";
else if (dx == 1 && dy == 1) cout << "POINT\n";
else cout << "LINE\n";
return 0;
}