작은 도서관

문제

 

최백준은 음하철도 구구팔에 탔다.
문제는 구구팔의 기장인 조교 김재홍이 반쯤 미쳐서 열차를 멈추지 않는다는 것이다. 그래서 최백준은 달리고 있는 열차에서 뛰어내려야 한다.
그런데 뛰어내릴 때 정류장 까지 거리가 너무 멀면 마이 아플 수 있다.
그래서 철도가 정류장에 가장 많이 근접했을 때 뛰어내리고자 한다.
어디서 뛰어내려야 하는가?

 

풀이

 

 처음에 예제를 보고 의아했다. 처음 위치인 (2, 1)에서 (2, 4)의 속도로 움직이는데 최백준 씨는(3, 3)에서 뛰어내렸다.

즉, (2, 1)에서 (1, 2)만큼 이동한 위치에서 뛰어내리신 것.

 따라서 속도를 공약수로 나눌 필요가 있었고, 함수 f를 정의했다.

 차례차례 주어지는 입력값을 각각 정류장의 위치인 (x, y), 현재 위치인 (X, Y), 속도인 (vx, vy)에 저장하고 백준 씨가 뛰어내릴 위치는 따로 (bx, by)로 정의했다. (물론 b는 baekjoon을 뜻한다.)

 뛰어내릴 위치는 현재 위치에서 일정한 속도로 움직여 도착할 다음 목적지 (X, Y)와 정류장의 위치 (x, y)의 거리가 백준씨가 있는 위치 (bx, by)와 정류장의 위치 (x, y)의 거리가 더 크다면 다음 목적지가 아닌 현재 위치 (bx, by)라고 판단한다.

 물론 거리를 구하기 위해 math 모듈의 sqrt(루트)함수를 사용하였다.

import math
def f(a,b):
    if a < b:
        tmp = a
        a = b
        b = tmp
    while b>0:
        c = b
        b = a % b
        a = c
    return int(a)
x, y = map(int,input().split())
X, Y, vx, vy = map(int,input().split())
be = f(vx, vy)
vx /= be; vy /= be
bx = X;by = Y
while True:
    distance = math.sqrt(((x-bx)**2)+((y-by)**2))
    if distance < math.sqrt(((x-X)**2)+((y-Y)**2)):
        print(bx, by)
        break
    bx = X;by = Y
    X += int(vx);Y += int(vy)

문제 평가

 

 사실 이 문제는 고등학교 함수파트 문제에서 많이 본 '직선 밖의 한 점 P에서 그은 선과 일차함수(직선)가 만나는 점을 Q라고 할 때, 직선 PQ의 최솟값을 구하여라.(단, P, Q는 정수)'라는 문제기에 크게 어려운 문제는 아니었다. 가장 어려운 부분은 백준 씨의 위치를 언제 갱신해야 할지가 아녔을지... 실제로 위치를 서너 번 옮겼다.

'코딩 > 백준 문제풀이' 카테고리의 다른 글

[파이썬] 2606 - 바이러스  (0) 2021.02.10
[파이썬] 2178 - 미로 탐색  (0) 2021.02.09
[파이썬] 2164 - 카드2  (0) 2021.01.26
[파이썬] 11557 - Yangjojang of The Year  (0) 2021.01.13
[파이썬][C] 8958 - OX퀴즈  (0) 2021.01.07
profile

작은 도서관

@Flrea

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!