[BOJ] 백준 1393번 문제 풀이 (Python)
Updated:
1. 문제 풀이 방법
열차와 정류장 사이의 최단거리를 구하는 문제이다. 3가지 항목만 주의하면 문제를 어렵지 않게 풀 수 있다.
- 직선이 아니라 반직선
- 열차는 한 방향으로만 움직이기 때문에 열차를 나타내는 반직선과 정류장 사이의 거리를 구해야한다.
- 뛰어내릴 좌표가 항상 정수
- 단순히 반직선과 점 사이의 최단거리를 나타내는 좌표를 정수로 형변환하게 되면 문제에서 원하는 답이 아닐 수도 있다.
- dx가 0
- dx가 0일 때 반직선의 기울기는 구할 수 없으므로 주의해야한다.
2. 풀이
import sys
def input(): return sys.stdin.readline().rstrip()
def func(x):
grad = dy / dx
return grad * x - grad * x_e + y_e
def distance(x1,y1,x2,y2):
return ((x1-x2) ** 2 + (y1-y2)**2)**(1/2)
x_s, y_s = map(int,input().split())
x_e, y_e, dx, dy = map(int,input().split())
min_d,x,y = distance(x_e,y_e,x_s,y_s),x_e,y_e
if dx > 0:
for i in range(x_e,1001):
if distance(i,func(i),x_s,y_s) < min_d:
min_d = distance(i, int(func(i)),x_s,y_s)
x,y = i, int(func(i))
elif dx < 0:
for i in range(x_e,-1001,-1):
if distance(i,func(i),x_s,y_s) < min_d:
min_d = distance(i, int(func(i)),x_s,y_s)
x,y = i, int(func(i))
elif dy > 0:
for i in range(y_e,1001):
if distance(x_e,i,x_s,y_s) < min_d:
min_d = distance(x_e,i,x_s,y_s)
x,y = x_e, i
else:
for i in range(y_e,-1001,-1):
if distance(x_e,i,x_s,y_s) < min_d:
min_d = distance(x_e,i,x_s,y_s)
x,y = x_e,i
print(x,y)
Leave a comment