작성일 :

문제 링크

15973번 - 두 박스

설명

두 직사각형의 좌하단과 우상단 좌표가 주어질 때, 두 직사각형의 교차 상태를 판정하는 문제입니다. 면적이 겹치면 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;
}