본문 바로가기

알고리즘/백준

백준[15973] 두 박스 (Python3)

상황별로 여러 분기가 필요한 문제.

완전탐색

노가다로 모든 경우에 대해 조건을 작성한다.
풀 수는 있지만, 코드가 너무 길어지고 중간에 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