본문 바로가기
프로그래밍/알고리즘

2527 직사각형

by 오답노트의 주인 2022. 9. 3.

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

 

2527번: 직사각형

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

www.acmicpc.net


접근

평범한 AABB를 구현하라는 문제 같다. 다른 점은 면이 겹쳐지는지, 선이 겹쳐지는지, 점이 겹쳐지는지, 안 만나는지를 출력해야 한다.

 

일단 만나지 않는 경우는 AABB에 나와있는 대로 하면 된다. 그런데 겹치는 상황에서 면이 겹쳐지는지 선이 겹쳐지는지 점이 겹쳐지는지를 알아야 한다.

 

출처 : 백준 2527 직사각형

사진에 표시한 점들은 직사각형을 나타내는 점들이다. 이 사진은 점이 겹쳐지는 상황을 의미하는데, 잘 보면 빨간색 점의 y좌표와 보라색 점의 y좌표가 같고, 초록색 점의 x좌표와 파란색 점의 x좌표가 같다.

좌표값이 같은 상황이 2개가 발생한다.

출처 : 백준 2527 직사각형

선분이 겹쳐지는 상황에서는 빨간색 점의 y좌표와 보라색 점의 y좌표만 같고 나머진 다 틀리다.

좌표값이 같은 상황이 1개가 발생한다.

 

면이 겹쳐지는 상황에서는 어떤 좌표도 같은 값을 갖지 않는다.

 

이렇게, 좌표값이 같은 상황의 개수에 따라 다르게 출력하면 된다.

 

직사각형의 위치가 다른 곳에 있을 수도 있으므로, 겹쳐진 상황을 판별하는 식은 아래처럼 두기로 했다.

Rect1(r1_left, r1_bottom, r1_right, r1_top), Rect2(r2_left, r2_bottom, r2_right, r2_top)로 둔다면,

 

좌표값이 같은 상황의 개수 =

    (r1_bottom == r2_top) + (r1_top == r2_bottom) + (r1_left == r2_right) + (r1_right == r2_left)

 

이해가 잘 안될 수 있으므로 코드를 보는게 좋겠다.

미흡했던 점

알고 있던 개념이라서 쉽게 풀었다.


#include <iostream>
struct Rect {
  int bottom, left, top, right;
};
int main() {
  Rect r1, r2;
  while (scanf("%d %d %d %d %d %d %d %d", &r1.left, &r1.bottom, &r1.right,
               &r1.top, &r2.left, &r2.bottom, &r2.right, &r2.top) != EOF) {
    if (r1.top < r2.bottom || r1.bottom > r2.top || r1.right < r2.left ||
        r1.left > r2.right) {
      printf("d");
    } else {
      int equalCoordsCount = (r1.top == r2.bottom) + (r1.bottom == r2.top) +
                             (r1.right == r2.left) + (r1.left == r2.right);
      printf("%c", equalCoordsCount == 0   ? 'a'
                   : equalCoordsCount == 1 ? 'b'
                                           : 'c');
    }
    puts("");
  }
}

'프로그래밍 > 알고리즘' 카테고리의 다른 글

1876 튕기는 볼링공  (0) 2022.09.06
4105 유클리드  (0) 2022.09.05
18187 평면 분할  (0) 2022.09.03
4811 알약  (0) 2022.09.02
1709 타일 위의 원  (0) 2022.09.02

댓글