BAEKJOON/단계별로 풀어보기

[BOJ] 1085번 : 직사각형에서 탈출

말하는 알감자 2022. 9. 16. 16:35

🔒 문제

한수는 지금 (x, y)에 있다. 직사각형은 각 변이 좌표축에 평행하고, 왼쪽 아래 꼭짓점은 (0, 0), 오른쪽 위 꼭짓점은 (w, h)에 있다. 직사각형의 경계선까지 가는 거리의 최솟값을 구하는 프로그램을 작성하시오.

⌨ 입력

첫째 줄에 x, y, w, h가 주어진다.

🖨 출력

첫째 줄에 문제의 정답을 출력한다.

📍 제한

  • 1 ≤ w, h ≤ 1,000
  • 1 ≤ x ≤ w-1
  • 1 ≤ y ≤ h-1
  • x, y, w, h는 정수

📚 예제

Ex1)

6 2 10 3


1

Ex2)

1 1 5 5


1

Ex3)

653 375 1000 1000


347

Ex4)

161 181 762 375


161

풀이

위 그림을 따라서 범위를 나눠본다.

  1. 파란선
    : 직사각형 선분위에 존재하기 때문에 최솟값은 0이다.
    (x == 0 or x == w) and (y == 0 or y == h)를 만족하면 된다.

  2. 노란색칠
    : 직사각형 내부에 존재하는 점으로, 직사각형의 각 변에 내린 수선의 발 중 가장 짧은 거리를 선택하면 된다.
    min(abs(x-0),abs(x-w),abs(y-0),abs(y-h)) 총 4개 중 작은 값 구하기!

  3. 빨간선과 빨간색칠
    : (0 <= x <= w) and (y > h or y < 0) 에 존재하는 점들로 직사각형의 각 변에 내린 수선의 발 중 가장 짧은 거리를 선택한다.
    min(abs(y-0),abs(y-h)) 총 2개 중 작은 값 구하기!

  4. 초록선과 초록색 칠
    : (x < 0 or x > w) and (0 <= y <= h) 에 존재하는 점들로 직사각형의 각 변에 내린 수선의 발 중 가장 짧은 거리를 선택한다.
    min(abs(x-0),abs(x-w)) 총 2개 중 작은 값 구하기!

  5. 분홍색칠
    : 분홍색이 칠해진 영역은 (x,y)에서 직사각형의 한 꼭짓점까지의 거리가 최소값이다.

    1) (x < 0 and y > h)
    : (0,h) 와 거리 구하기
    2) (x < 0 and y < 0)
    : (0,0) 와 거리 구하기
    3) (x > w and y > h)
    : (w,h) 와 거리 구하기
    4) (x > w and y < 0)
    : (w,0) 와 거리 구하기

🔑 python 코드


import math
import sys

def find_shortestpath(x,y,w,h):
    m = 0
    if((x == 0 or x == w)and(y==0 or y==h)):
        return m
    elif(0<x<w)and(0<y<h):
        return min(abs(x-0),abs(x-w),abs(y-0),abs(y-h))
    elif(0<=x<=w):
        return min(abs(y-0),abs(y-h))
    elif(0<=y<=h):
        return min(abs(x-0),abs(x-w))
    elif(x<0 and y>h):
        a = (0-x)
        b = (y-h)
        m = math.sqrt((a*a)+(b*b))
        return m
    elif(x>w and y>h):
        a = (x-w)
        b = (y-h)
        m = math.sqrt((a*a)+(b*b))
        return m
    elif(x<0 and y<0):
        a = (x-0)
        b = (y-0)
        m = math.sqrt((a*a)+(b*b))
        return m
    elif(x>w and y<0):
        a = (x-w)
        b = (y-0)
        m = math.sqrt((a*a)+(b*b))
        return m

x,y,w,h = map(int,sys.stdin.readline().split())
m = find_shortestpath(x,y,w,h)
print(m)