알고리즘/BOJ

[백준] 2527_직사각형

엉아_ 2021. 8. 22. 16:29
728x90

📕 문제

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개의 줄에 각각 차례대로 출력해야 한다.

💡 풀이법

1. 먼저 p1과 x2로 경우의 수를 나누었다.

2. 입력에서 첫번째 사각형과 두번째 사각형 중 어떤게 x축에 더 가까운 사각형일지 모르기 때문에 리스트에 넣어서 정렬한 후, 무조건 첫번째 사각형이 x축과 가까운 사각형이 되도록 만들었다.

( 이렇게 하지 않으면 정말 많은 경우의 수를 생각해줘야 함😱)

3. 이후 각 경우의 수에서 더 세분화해서 경우의 수를 나누어 주었다.

 

for _ in range(4):
    a, b, c, d, e, f, g, h = map(int, input().split())
    lst = [(a, b, c, d), (e, f, g, h)]
    lst.sort()
    x1, y1, p1, q1 = lst[0]
    x2, y2, p2, q2 = lst[1]
    result = 'd'
    if p1 > x2:
        if y1 <= y2 < q1 or y1 < q2 <= q1 or (y2 < y1 and q2 > q1):  # 겹치는 부분이 사각형
            result = 'a'
        elif y2 == q1 or q2 == y1:  # 겹치는 부분이 선
            result = 'b'
    elif p1 == x2:
        if y2 == q1 or q2 == y1:  # 겹치는 부분이 꼭지점
            result = 'c'
        else:  # 겹치는 부분이 선
            result = 'b'
    print(result)