🔒 문제
한수는 지금 (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
풀이
위 그림을 따라서 범위를 나눠본다.
파란선
: 직사각형 선분위에 존재하기 때문에 최솟값은 0이다.
(x == 0 or x == w) and (y == 0 or y == h)를 만족하면 된다.노란색칠
: 직사각형 내부에 존재하는 점으로, 직사각형의 각 변에 내린 수선의 발 중 가장 짧은 거리를 선택하면 된다.
min(abs(x-0),abs(x-w),abs(y-0),abs(y-h)) 총 4개 중 작은 값 구하기!빨간선과 빨간색칠
: (0 <= x <= w) and (y > h or y < 0) 에 존재하는 점들로 직사각형의 각 변에 내린 수선의 발 중 가장 짧은 거리를 선택한다.
min(abs(y-0),abs(y-h)) 총 2개 중 작은 값 구하기!초록선과 초록색 칠
: (x < 0 or x > w) and (0 <= y <= h) 에 존재하는 점들로 직사각형의 각 변에 내린 수선의 발 중 가장 짧은 거리를 선택한다.
min(abs(x-0),abs(x-w)) 총 2개 중 작은 값 구하기!분홍색칠
: 분홍색이 칠해진 영역은 (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)
'BAEKJOON > 단계별로 풀어보기' 카테고리의 다른 글
[BOJ] 4153번 : 직각삼각형 (0) | 2022.09.27 |
---|---|
[BOJ] 3009번 : 네번째 점 (0) | 2022.09.27 |
[BOJ] 11478번 : 서로 다른 부분 문자열의 개수 (0) | 2022.09.15 |
[BOJ] 1269번 : 대칭 차집합 (0) | 2022.09.14 |
[BOJ] 1764번 : 듣보잡 (0) | 2022.09.14 |