[BOJ][⚪1][백준#02527] 직사각형

작성:    

업데이트:

카테고리:

태그: , , ,

문제 출처

BAEKJOON Online Judge #2527


문제

2차원 격자공간에 두 개의 꼭짓점 좌표로 표현되는 직사각형이 있다. 직사각형은 아래와 같이 왼쪽 아래 꼭짓점 좌표 (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개의 줄에 각각 차례대로 출력해야 한다.


예제

입력

3 10 50 60 100 100 200 300
45 50 600 600 400 450 500 543
11 120 120 230 50 40 60 440
35 56 67 90 67 80 500 600


출력

d
a
a
b


My Sol

def search(lst):
    ai1, aj1, ai2, aj2, bi1, bj1, bi2, bj2 = lst
    # d인 경우
    if (ai2 < bi1) or (ai1 > bi2) or (aj1 > bj2) or (aj2 < bj1):
        return 'd'

    # b와 c인 경우
    elif (ai1 == bi2) or (ai2 == bi1):
        if (aj2 == bj1) or (aj1 == bj2): return 'c'
        else: return 'b'

    elif (aj1 == bj2) or (aj2 == bj1):
        if (ai2 == bi1) or (ai1 == bi2): return 'c'
        else: return 'b'

    return 'a'

for _ in range(4):
    lst = list(map(int, input().split()))
    print(search(lst))

각 좌표에 대한 선분을 기준으로 경우의 수를 나누어 풀었다. 다소 하드코딩적인 부분이 있지만, 어떻게 보면 완벽히 모든 상황을 고려해서 푼 것이다보니 틀리지 않았던 것 같다.


결과

맞았습니다!!


모범답안

출처

for tc in range(4):
    x1, y1, p1, q1, x2, y2, p2, q2 = map(int, input().split())

    sl = max(x1, x2)
    sr = min(p1, p2)
    sb = max(y1, y2)
    st = min(q1, q2)

    if sl == sr and sb == st:
        print('c')
    elif (sl == sr and sb < st) or (sb == st and sl < sr):
        print('b')
    elif sl < sr and sb < st:
        print('a')
    else:
        print('d')

max와 min함수를 이용해서 두 사각형을 나누어 생각하는 것이 아니라, 범위로 생각하여 푼 것 같은데, 발상이 정말로 대단하다.

댓글남기기