알고리즘/알고리즘(Java)

03. 게시판 포스트 중첩부분 면적 구하기

산을좋아한라쯔 2015. 3. 27. 20:14
반응형

문제

게시판에 포스터를 붙일 때, 이미 포스터가 붙여져 있으면, 기존의 포스트 면적의 절반 이상은 가릴 수 없도록 되어 있다.

만약 두 개의 포스터가 겹쳐져서 붙여져 있을 때, 아래 포스터의 보이는 부분의 면적을 구하라.

 

포스터는 둘 다 직사각형이며, 게시판 벽에 평행하게 붙어 있다고 가정. 또한, 각 포스터의 위치는 왼쪽 아래와 오른쪽 위 두 꼭지점의 좌표로 주어진다.

 

입력: 공백으로 분리된 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();

 

         }

 

}

 

-끝-

 

반응형