백준 BaekJoon 15973번: 두 박스 [Java]

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

 

15973번: 두 박스

표준 입력으로 두 박스의 정보가 한 줄에 하나씩 주어진다. 각 박스의 정보는 왼쪽 아래 꼭짓점 좌표 (x1, y1)과 오른쪽 위 꼭짓점 좌표 (x2, y2)로 구성되는데 이들 좌푯값 x1, y1, x2, y2 (x1 < x2, y1 < y2)

www.acmicpc.net