[BOJ][⚪1][백준#02527] 직사각형
작성:    
업데이트:
카테고리: BOJ Silver I
태그: BOJ, BOJ Silver, PS, Python
문제 출처
문제
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함수를 이용해서 두 사각형을 나누어 생각하는 것이 아니라, 범위로 생각하여 푼 것 같은데, 발상이 정말로 대단하다.
댓글남기기