접근

처음에는 직선으로 하는 이동만 생각해서 d 로 뛸 수 있는 만큼 뛰고 남은 거리를 걷거나, 거기서 한번 더 뛰고 다시 뒤로 걷는 두가지 경우만 생각했지만, 한번 틀리고 다시 생각해보니 두가지를 놓쳤다는 것을 알 수 있었다.

  1. d 보다 짧은 거리를 이동할 때, 걷는 것보다 한번 꺾어서 두번 뛰는 것이 더 빠를 수 있다는 것
  2. 뛰는 것보다 걷는 것이 더 빠를 수도 있다는 것

두가지를 고려하여 다음과 같이 비교하여 문제를 해결할 수 있었다.

전체 거리가 d 보다 클 때,

  1. d로 뛸 수 있는 만큼 뛰고 남은 거리를 걷는 것
  2. d로 뛸 수 있는 만큼 뛰고 남은 거리를 꺾어서 두번에 뛰는 것
  3. 처음부터 끝까지 걷는 것

전체 거리가 d보다 작을 때,

  1. d로 목적지 방향으로 뛰고 다시 되돌아 걷는 것
  2. 꺾는 방향으로 두번 뛰는 것
  3. 처음부터 끝까지 걷는 것

코드

import sys

x, y, d, t = map(int, sys.stdin.readline().split())
distance = (x ** 2 + y ** 2) ** 0.5
if distance >= d:
    ans = min(t * (distance // d) + distance % d, t * (distance // d + 1), distance)
else:
    ans = min(t + (d - distance), 2 * t, distance)
print(ans)

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기