상황별로 여러 분기가 필요한 문제.
완전탐색
노가다로 모든 경우에 대해 조건을 작성한다.
풀 수는 있지만, 코드가 너무 길어지고 중간에 WA를 받기라도 한다면 너무 피곤해진다.
완전탐색 최적화
도형의 순서를 정한다.
예를 들자면, 두 도형이 있을 때, x축을 기준으로 왼쪽에 있는 도형은 반드시 하나가 있을 것이다.
나는 왼쪽에 오는 박스를 A, 오른쪽에 오는 박스를 B로 정해 고려할 경우의 수를 반으로 줄였다.
그 다음 박스 A의 x2 좌표와 박스B의 x1 크기를 비교하면, 분기 초입을 2가지로 축소할 수 있다.
편의상 박스 A의 x2는 Ax2식으로 표기한다.
+ Ax2 == Bx1
+ + 특정 값들이 같다면 POINT이다.
+ + Ay1, By1, By2 가 특정 값 범위라면 LINE이다.
+ Ax2 > Bx1
+ + By2와 Ay1, Ay2와 By1간의 일치 여부를 통해 LINE을 판별
+ + 만약 크거나 작다면 FACE 아니면 LINE이다.
+ Ax2 < Bx1
+ + 이 경우 박스 A와 B는 겹치지 않기 때문에 NULL이다.
대소 범위에 맞춰 분기를 잘 나누면 풀 수 있다.
논리가 꼬이면 안 되는 생각이 필요한 문제
더보기
def main():
ax1, ay1, ax2, ay2 = map(int, input().split())
bx1, by1, bx2, by2 = map(int, input().split())
if ax1 > bx1:
ax1, bx1 = bx1, ax1
ay1, by1 = by1, ay1
ax2, bx2 = bx2, ax2
ay2, by2 = by2, ay2
if ax2 == bx1:
if ay2 == by1 or ay1 == by2:
return "POINT"
elif ay1 <= by1 <= ay2 or ay1 <= by2 <= ay2 or by1 <= ay1 <= by2:
return "LINE"
elif ax2 > bx1:
if by2 < ay1 or ay2 < by1:
return "NULL"
elif by2 == ay1 or ay2 == by1:
return "LINE"
else:
return "FACE"
return "NULL"
if __name__ == "__main__":
print(main())
'알고리즘 > 백준' 카테고리의 다른 글
백준[1092] 배 (Python3) (0) | 2022.11.05 |
---|---|
백준[17616] 등수 찾기 (Python3) (0) | 2022.11.05 |
백준[19585] 전설 (Python3) (0) | 2022.11.05 |
백준[14867] 물통 (Python3) (0) | 2022.11.05 |
백준[17610] 양팔저울 (Python3) (0) | 2022.11.05 |