[BOJ] 1085번, 직사각형에서 탈출(Python)
https://www.acmicpc.net/problem/1018
서론
알고리즘 공부를 막상 시작해야할때 어떤 것 부터 풀어야할지 몰라서 solved.ac에서 class 2를 쭉 풀어보기로 했다.
class 1은 나중에 c++ 문법 공부하면서 풀 것이므로 지금은 건너 뛴다.
맨 위에 있는 직사각형에서 탈출을 풀어보자
문제
한수는 지금 (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는 정수
입출력 예시는 본 사이트 가서 보도록 하자
해설
주어진 w,h로 직사각형 그렸을때, 내부에 있는 임의의 좌표 x,y에서 w,h로 그린 직사각형 변까지의 최소 거리를 구하면 된다. x,y가 왜 내부에 있는 점이냐면 제한에서 보면 알 수 있다.
- 1 ≤ x ≤ w-1
- 1 ≤ y ≤ h-1
또 이 문제에서 걸어놓은 제한사항 중에 하나가 왼쪽 아래 꼭지점은 0,0으로 고정되어 있다는 점! 그러면 사각형의 위치는 고려하지 않아도 되니 문제는 쉬워진다
문제에서 준 조건대로 그림을 한번 그려보았다. 변과 점의 최소 거리는 직각이 되는 선분의 길이와 같은데 저 4개의 선분 중 가장 길이 짧은 선분의 길이를 출력해주면 된다.
0,0으로 시작해서 기울지 않는 예쁜 직사각형이기 때문에 오른쪽 가로는 w-x 왼쪽 가로는 x 위쪽 세로는 h-y 아래쪽 세로는 y이다.
내가 작성한 코드는
x,y,w,h = map(int,input().split())
def minLen(a,b):
return b-a if b-a<a else a
print( minLen(x,w) if minLen(x,w)<minLen(y,h) else minLen(y,h) )
이건데 가로(w-x, x)와 세로(h-y, y) 먼저 비교하고 그 중 짧은 것끼리 한번 더 비교해서 출력해준다.
사실 min()이라는 함수를 쓰면 두줄만에 끝난다. 이거 풀 당시에는 min을 쓸 생각을 못했다.
x,y,w,h=map(int,input().split())
print(min(w-x,h-y,x,y))
최단거리에 대한 기본개념만 알면 풀 수 있는 문제였다.