https://www.acmicpc.net/problem/2527

 

2527번: 직사각형

4개의 줄로 이루어져 있다. 각 줄에는  8개의 정수가 하나의 공백을 두고 나타나는데, 첫 4개의 정수는 첫 번째 직사각형을, 나머지 4개의 정수는 두 번째 직사각형을 각각 나타낸다. 단 입력 직

www.acmicpc.net

 

문제

x2차원 격자공간에 두 개의 꼭짓점 좌표로 표현되는 직사각형이 있다. 직사각형은 아래와 같이 왼쪽 아래 꼭짓점 좌표 (x, y)와 오른쪽 위 꼭짓점 좌표 (p, q)로  주어진다.  

이 문제에서 모든 직사각형은 두 꼭짓점의 좌표를 나타내는 4개의 정수 x y p q 로 표현된다. 단 항상 x<p, y<q 이다. 예를 들어 위 그림에 제시된 직사각형이라면 아래와 같이 표현된다.

3 2 9 8

두 개의 직사각형은 그 겹치는 부분의 특성에 따라 다음 4가지 경우로 분류될 수 있다. 

먼저 두 직사각형의 겹치는 부분이 직사각형인 경우이다. 아래 그림(a)는 공통부분이 직사각형인 경우의 3가지 예를 보여준다,    

그림 (a)

또는 겹치는 부분이 아래 그림 (b)와 같이 선분이 될 수도 있고, 그림 (c)와 같이 점도 될 수 있다.   

그림 (b)

그림 (c)

마지막으로 아래 그림 (d)와 같이 공통부분 없이 두 직사각형이 완전히 분리된 경우도 있다.

그림 (d)

여러분은 두 직사각형의 겹치는 부분이 직사각형인지, 선분인지, 점인지, 아니면 전혀 없는 지를 판별해서 해당되는 코드 문자를 출력해야 한다. 

공통부분의 특성코드 문자

직사각형 a
선분 b
c
공통부분이 없음 d

 

입력

4개의 줄로 이루어져 있다. 각 줄에는  8개의 정수가 하나의 공백을 두고 나타나는데, 첫 4개의 정수는 첫 번째 직사각형을, 나머지 4개의 정수는 두 번째 직사각형을 각각 나타낸다. 단 입력 직사각형의 좌표 값은 1이상 50,000 이하의 정수로 제한된다.  

출력

4개의 각 줄에 주어진 두 직사각형의 공통부분을 조사해서 해당하는 코드 문자를 출력파일의 첫 4개의 줄에 각각 차례대로 출력해야 한다.

 

 

[풀이]

사각형을 s1과 s2로 정의해 s1[]과 s2[] 배열에 위와 같이 입력된 좌표값을 저장하고,

 

두 직사각형의 관계를 찾기 위해 두 사각형을 모두 포함할 수 있는 끝점과의 거리 endtoend와

각각의 직사각형의 가로(혹은 세로)길이의 합을 비교해주었습니다.

 

sum은 각각의 직사각형의 가로(혹은 세로)의 길이의 합이므로 아래와 같이 쉽게 계산할 수 있지만,

int w_sum = s1[2] - s1[0] + s2[2] - s2[0];
int h_sum = s1[3] - s1[1] + s2[3] - s2[1];

 

endtoend를 계산할 때에는 위와 같은 경우를 놓치지 않도록 주의해 다음과 같이 계산하도록 합니다.

int w_endtoend = Integer.max(s1[2], s2[2]) - Integer.min(s1[0], s2[0]);
int h_endtoend = Integer.max(s1[3], s2[3]) - Integer.min(s1[1], s2[1]);

 

 

w_endtoend와 w_sum부터 비교해보겠습니다.

위와 같은 상황에서 가로는 w_sum>w_endtoend 이며, w_sum>w_endtoend 인 경우 가능한 관계들로는

 

h_sum>h_endtoend 일 때, 직사각형으로 만나는 경우 a와,

 

h_sum==h_endtoend 일 때, 선분으로 만나는 경우 b와,

 

h_sum<h_endtoend 일 때, 만나지 않는 경우 d가 있습니다.

 

위와같이 sum과 endtoend의 크기를 비교해 나머지 관계들도 조건문으로 처리해주었습니다.

이하 내용은 아래 코드에 작성되어있습니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_02527 {
	static int min = 1;
	static int max = 50000;

	public static void main(String[] s1rgs) throws IOException {
		BufferedReader s2r = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		int T = 4;
		for (int t = 0; t < T; t++) {
			st = new StringTokenizer(s2r.readLine(), " ");
			int[] s1 = new int[4];
			int[] s2 = new int[4];
			for (int i = 0; i < 4; i++) {
				s1[i] = Integer.parseInt(st.nextToken());
			}
			for (int j = 0; j < 4; j++) {
				s2[j] = Integer.parseInt(st.nextToken());
			}
			System.out.println(classify(s1,s2));
		}
	}

	static char classify(int[] s1, int[] s2) {
		int w_sum = s1[2] - s1[0] + s2[2] - s2[0];
		int h_sum = s1[3] - s1[1] + s2[3] - s2[1];
		int w_endtoend = Integer.max(s1[2], s2[2]) - Integer.min(s1[0], s2[0]);
		int h_endtoend = Integer.max(s1[3], s2[3]) - Integer.min(s1[1], s2[1]);
		if (w_sum > w_endtoend) {
			if (h_sum > h_endtoend) {
				return 'a';
			} else if (h_sum == h_endtoend) {
				return 'b';
			} else
				return 'd';
		} else if (w_sum == w_endtoend) {
			if (h_sum > h_endtoend)
				return 'b';
			else if (h_sum == h_endtoend)
				return 'c';
			else
				return 'd';
		} else
			return 'd';
	}
}

'문제해결 > 백준' 카테고리의 다른 글

백준 10026번-적록색약(JAVA)  (0) 2021.09.22
백준 1149번-RGB거리(JAVA)  (1) 2021.09.14
백준 2304번-창고 다각형(JAVA)  (0) 2021.08.25
백준 1753번-최단경로(JAVA)  (0) 2021.08.24
백준 10157번-자리배정(JAVA)  (0) 2021.08.24

+ Recent posts