[白俊]15973/2箱
# 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;
}
Reference
この問題について([白俊]15973/2箱), 我々は、より多くの情報をここで見つけました https://velog.io/@gglifer/백준-15973-두-박스テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol