[ 백준 ] 15973 / 두 박스

金弘均·2021년 9월 16일
0

Baekjoon Online Judge

목록 보기
147/228
post-thumbnail
post-custom-banner

# Appreciation

/*
 * Problem :: 15973 / 두 박스
 *
 * Kind :: Math
 *
 * Insight
 * - 총 4가지의 경우가 있다
 *   + 만나지 않는다 => NULL
 *     한 점에서 만난다 => POINT
 *     한 선분에서 만난다 => LINE
 *     서로 겹친다 => FACE
 *     # 일단 (b) LINE 의 경우와 (d) FACE 의 경우를 보니
 *       주어진 두 개의 직사각형이 겹치는지 먼저 알아보는 것은 좀 까다로울 것 같다
 *       -> 그에 비해서 만나는지 그렇지 않은지 확인하는 것은 상대적으로 쉬워보인다
 *          그러면 만나는지부터 체크한 후, 차례로
 *          점으로 만나는지 체크, 선으로 만나는지 체크한 다음
 *          전부다 아니라면 겹치는 것으로 보아도 될 것 같다
 *
 * Point
 * - 그냥... 공책에다가
 *   그림을 그려가면서 풀었어야 했다
 *
 * - 주어진 두 개의 직사각형을 각각 P,Q 라고 할 때,
 *   가능한 위치 관계는 다음과 같다
 *   + 좌우로 2가지 경우
 *     # P가 Q의 왼쪽에 있다 = Q가 P의 오른쪽에 있다
 *     # P가 Q의 오른쪽에 있다 = Q가 P의 왼쪽에 있다
 *   + 위아래로 2가지 경우
 *     # P가 Q의 위쪽에 있다 = Q가 P의 아래쪽에 있다
 *     # P가 Q의 아래쪽에 있다 = Q가 P의 위쪽에 있다
 *     -> 따라서, 총 4(2*2)가지의 서로 다른 위치 관계가 나오게 된다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>

using namespace std;

#define endl '\n'

// Set up : Global Variables
struct Point { long x, y; };
struct Square { Point ll, lr, ul, ur; }; /* ll - lower left,
                                          * lr - lower right,
                                          * ul - upper left,
                                          * ur - upper right */

// Set up : Functions Declaration
bool operator == (const Point &u, const Point &v);
bool isNull(Square s1, Square s2);
bool isPoint(Square s1, Square s2);
bool isLine(Square s1, Square s2);


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int x1, y1, x2, y2;
    Square s1{}, s2{};
    cin >> x1 >> y1 >> x2 >> y2;
    s1.ll.x = s1.ul.x = x1; /* 직사각형 s1 좌변 x 좌표 설정 */
    s1.lr.x = s1.ur.x = x2; /* 직사각형 s1 우변 x 좌표 설정 */
    s1.ll.y = s1.lr.y = y1; /* 직사각형 s1 아랫변 y 좌표 설정 */
    s1.ul.y = s1.ur.y = y2; /* 직사각형 s1 윗변 y 좌표 설정 */
    cin >> x1 >> y1 >> x2 >> y2;
    s2.ll.x = s2.ul.x = x1; /* 직사각형 s2 좌변 x 좌표 설정 */
    s2.lr.x = s2.ur.x = x2; /* 직사각형 s2 우변 x 좌표 설정 */
    s2.ll.y = s2.lr.y = y1; /* 직사각형 s2 아랫변 y 좌표 설정 */
    s2.ul.y = s2.ur.y = y2; /* 직사각형 s2 윗변 y 좌표 설정 */

    // Process
    // Control : Output
    if (isNull(s1, s2))
        cout << "NULL" << endl;
    else if (isPoint(s1, s2))
        cout << "POINT" << endl;
    else if (isLine(s1, s2))
        cout << "LINE" << endl;
    else
        cout << "FACE" << endl;
}

// Helper Functions
bool operator == (const Point &u, const Point &v)
/* 좌표 구조체 비교(같음)를 위한 함수 */
{
    return u.x == v.x && u.y == v.y;
}

bool isNull(Square s1, Square s2)
/* 주어진 두 직사각형의 관계가 NULL 이면 true 를 반환, 그 외 false 를 반환 */
{
    /* s1 아랫변의 y 좌표가 s2 윗변의 y 좌표보다 크거나
     * s2 아랫변의 y 좌표가 s1 윗변의 y 좌표보다 크면 NULL */
    if (s1.ll.y > s2.ur.y || s2.ll.y > s1.ur.y) return true;
    /* s1 좌변의 x 좌표가 s2 우변의 x 좌표보다 크거나
     * s2 좌변의 x 좌표가 s1 우변의 x 좌표보다 크면 NULL */
    if (s1.ll.x > s2.ur.x || s2.ll.x > s1.ur.x) return true;
    /* 위의 경우에 해당하지 않으면 NULL 은 아님 */
    return false;
}

bool isPoint(Square s1, Square s2)
/* 주어진 두 직사각형의 관계가 POINT 이면 true 를 반환, 그 외 false 를 반환 */
{
    /* s1 왼쪽 아래 꼭짓점 좌표가 s2 오른쪽 위 꼭짓점 좌표와 같거나
     * s2 왼쪽 아래 꼭짓점 좌표가 s1 오른쪽 위 꼭짓점 좌표와 같으면 POINT */
    if (s1.ll == s2.ur || s2.ll == s1.ur) return true;
    /* s1 오른쪽 아래 꼭짓점 좌표가 s2 왼쪽 위 꼭짓점 좌표와 같거나
     * s2 오른쪽 아래 꼭짓점 좌표가 s2 왼쪽 위 꼭짓점 좌표와 같으면 POINT */
    if (s1.lr == s2.ul || s2.lr == s1.ul) return true;
    /* 위의 경우에 해당하지 않으면 POINT 는 아님 */
    return false;
}

bool isLine(Square s1, Square s2)
/* 주어진 두 직사각형의 관계가 LINE 이면 true 를 반환, 그 외 false 를 반환 */
{
    /* s1 좌변의 x 좌표와 s2 우변의 x 좌표가 같거나
     * s2 좌변의 x 좌표와 s1 우변의 x 좌표가 같으면 LINE */
    if (s1.ll.x == s2.ur.x || s2.ll.x == s1.ur.x) return true;
    /* s1 아랫변의 y 좌표와 s2 윗변의 y 좌표가 같거나
     * s2 아랫변의 y 좌표와 s1 윗변의 y 좌표가 같으면 LINE */
    if (s1.ll.y == s2.ur.y || s2.ll.y == s1.ur.y) return true;
    /* 위의 경우에 해당하지 않으면 LINE 은 아님 */
    return false;
}
profile
이런 미친 게임을 봤나! - 옥냥이
post-custom-banner

0개의 댓글