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 |