문제
게시판에 포스터를 붙일 때, 이미 포스터가 붙여져 있으면, 기존의 포스트 면적의 절반 이상은 가릴 수 없도록 되어 있다.
만약 두 개의 포스터가 겹쳐져서 붙여져 있을 때, 아래 포스터의 보이는 부분의 면적을 구하라.
포스터는 둘 다 직사각형이며, 게시판 벽에 평행하게 붙어 있다고 가정. 또한, 각 포스터의 위치는 왼쪽 아래와 오른쪽 위 두 꼭지점의 좌표로 주어진다.
입력: 공백으로 분리된 8개의 정수 x1 y1 x2 y2 x3 y3 x4 y4 Ex)2 3 5 8 4 7 6 10
아래쪽에 있는 포스터의 왼쪽 아래 좌표는 (x1,y1), 오른쪽 위편 좌표는 (x2,y2)
위쪽에 붙여지는 포스터의 왼쪽 아래 좌표는 (x3,y3), 오른쪽 위편 좌표는 (x4,y4)
출력: 아래편 포스터의 보이는 부분(노출된 부분) 면적 Ex)14
풀이
소스
package p1;
public class CalculateRectArea {
public CalculateRectArea() {
test();
}
private void test() {
int[][] p = { { 2, 3, 5, 8, 4, 7, 6, 10 }, { 1, 1, 5, 5, 2, 2, 4, 4 }, { 2, 2, 4, 4, 1, 1, 5, 5 } };
long area = 0;
for (int i = 0; i < p.length; i++) {
area = calculateRemainedArea(p[i]);
System.out.println(i + ":" + area);
}
}
/**
* There is two rectangle R1 and R2.
* R1's left-bottom point is x1,y1 and right-top point is x2,y2
* R2's left-bottom point is x3,y3 and right-top point is x4,y4
*
* Calculating remained rectangle area: R1's area - 겹쳐진 area
* - 겹쳐진 Area = (x3 >= x2 || x4 <= x1 || y3 >= y2 || y4 <= y1) ? 0 : (w2-w1)
* * (h2 - h1)
* - w1 = (x1 < x3 < x2) ? x3 : x1
* w2 = (x1 < x4 < x2) ? x4 : x2
* h1 = (y1 < y3 < y2) ? y3 : y1
* h2 = (y1 < y4 < y2) ? y4 : y2
*
* @param arr
* x1,y1, x2,y2, x3,y3, x4,y4
* @return
*/
private long calculateRemainedArea(int[] arr) {
int x1, y1, x2, y2, x3, y3, x4, y4;
x1 = arr[0];
y1 = arr[1];
x2 = arr[2];
y2 = arr[3];
x3 = arr[4];
y3 = arr[5];
x4 = arr[6];
y4 = arr[7];
int w1, w2, h1, h2;
w1 = (x1 < x3) ? x3 : x1;
w2 = (x4 < x2) ? x4 : x2;
h1 = (y1 < y3) ? y3 : y1;
h2 = (y4 < y2) ? y4 : y2;
long dupArea = 0;
dupArea = (x3 >= x2 || x4 <= x1 || y3 >= y2 || y4 <= y1) ? 0 : (w2 - w1) * (h2 - h1);
long remainedArea = (x2 - x1) * (y2 - y1) - dupArea;
return remainedArea;
}
public static void main(String[] args) {
new CalculateRectArea();
}
}
-끝-
'알고리즘 > 알고리즘(Java)' 카테고리의 다른 글
05. 거스름돈 계산 문제 (0) | 2015.03.30 |
---|---|
04. 타일 채우기 가능여부 판단 알고리즘 (0) | 2015.03.30 |
02. 영문자 순열 순서 알아내기 (0) | 2015.03.27 |
01. Factorial, Permutation, Combination (0) | 2015.03.18 |
00. 시작하기, 준비하기 (0) | 2015.03.13 |