2021-01-04
문제
2차원 좌표 평면 위에 두 개의 박스(직사각형) P, Q가 놓여 있다. 각 박스의 변은 x축이나 y축에 평행하다. 박스를 연구하는 학수는 이 두 박스의 교차 상태를 파악하여 내부가 겹쳐 있는지 (FACE), 그렇지 않고 선분에서 만나는 지(LINE), 그렇지 않고 한 점에서 만나는지(POINT), 아예 만나지 않는지 (NULL) 구별하려고 한다.
다음 그림은 두 박스의 여러 가지 교차 상태의 예를 보여준다.
입력
표준 입력으로 두 박스의 정보가 한 줄에 하나씩 주어진다. 각 박스의 정보는 왼쪽 아래 꼭짓점 좌표 (x1, y1)과 오른쪽 위 꼭짓점 좌표 (x2, y2)로 구성되는데 이들 좌푯값 x1, y1, x2, y2 (x1 < x2, y1 < y2)가 공백을 사이에 두고 주어진다.
출력
표준 출력으로 두 박스의 교차 상태를 POINT, LINE, FACE, NULL 중의 하나로 출력한다. 두 박스의 교차 상태는 모두 대문자로 출력한다.
제한
모든 서브태스크에서 x좌표와 y좌표는 모두 -109 이상 109 이하인 정수이다.
서브태스크 1 (33점)
POINT나 LINE인 경우만 있다.
서브태스크 2 (30점)
모든 좌푯값이 0 이상 1,000 이하이다.
서브태스크 3 (37점)
원래의 제약조건 이외에 아무 제약조건이 없다.
import java.util.Scanner;
public class TemplateA {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int [] a = new int [4];
int [] b = new int [4];
for(int i = 0; i < 4; i++) {
a[i] = scan.nextInt();
}
int arMax = 0;
//a행의 최대 범위 값이 들어갈 변수
int arMin = 1000;
//a행의 최대 범위 값이 들어갈 변수
if(a[0] > a[2]) {
arMax = a[0];
arMin = a[2];
}else {
arMax = a[2];
arMin = a[0];
}
int acMax = 0;
//a열의 최대 범위 값이 들어갈 변수
int acMin = 1000;
//a열의 최대 범위 값이 들어갈 변수
if(a[1] > a[3]) {
acMax = a[1];
acMin = a[3];
}else {
acMax = a[3];
acMin = a[1];
}
for(int i = 0; i < 4; i++) {
b[i] = scan.nextInt();
}
int brMax = 0;
//b행의 최대 범위 값이 들어갈 변수
int brMin = 1000;
//b행의 최소 범위 값이 들어갈 변수
if(b[0] > b[2]) {
brMax = b[0];
brMin = b[2];
}else {
brMax = b[2];
brMin = b[0];
}
int bcMax = 0;
//b열의 최대 범위 값이 들어갈 변수
int bcMin = 1000;
//b열의 최소 범위 값이 들어갈 변수
if(b[1] > b[3]) {
bcMax = b[1];
bcMin = b[3];
}else {
bcMax = b[3];
bcMin = b[1];
}
if(a[0] == b[0] && a[1] == b[1]
|| a[2] == b[2] && a[3] == b[3]
|| a[0] == b[2] && a[1] == b[3]
|| a[2] == b[0] && a[3] == b[1]) {
System.out.println("POINT");
//행과열이 모두 값은 점이 하나 존재하는지 체크 함
}else if((arMax >= brMax && arMin <= brMin) || (acMax >= bcMax && acMin <= bcMin)) {
System.out.println("FACE");
//b의 행과 열이 a의 행에 영역에서 모두 포함되거나, 열의 영역에서 모두 포함되는지 체크
}else if((arMax > brMax && arMin > brMin && (acMin == bcMin || acMin == bcMax || acMax == bcMin || acMax == bcMax ))
|| (acMax > bcMax && acMin > bcMin && (arMin == brMin || arMin == brMax || arMax == brMin || arMax == brMax ))
|| (arMax < brMax && arMin < brMin && (acMin == bcMin || acMin == bcMax || acMax == bcMin || acMax == bcMax ))
|| (acMax < bcMax && acMin < bcMin && (arMin == brMin || arMin == brMax || arMax == brMin || arMax == brMax ))) {
System.out.println("LINE");
//b가 a에 한 선만 겹치면서 적어도 a의 행이나 열의 끝접접에 위치하는지 체크
}else {
System.out.println("NULL");
}
}
}
출처링크: www.acmicpc.net/problem/15973