본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 1069 집으로

by Alan_Kim 2023. 12. 7.
728x90
반응형

https://www.acmicpc.net/problem/1069

 

1069번: 집으로

은진이는 지금 (X, Y)에 있고, (0, 0)에 있는 집으로 가능한 빨리 가려고 한다. 이동할 수 있는 방법은 다음 두 가지이다. 첫 번째 방법은 걷는것이다. 걸을 때는 1초에 1만큼 움직인다. 두 번째 방법

www.acmicpc.net

 

 

문제 해결

  • 걸을 때 1초에 1만큼 움직인다. 이는 택시기하학으로 움직이는 것이 아니고 자유롭게 대각선이든 반경 1안에 모든 점으로 1초에 이동할 수 있다는 것이다.
  • 점프도 마찬가지다. 일직선으로 할 수 있다는 뜻은 정확히 거리가 D인 지점까지 T초에 간다는 뜻이다.
  • 따라서 현재 거리, 즉 (x,y)와 (0,0) 거리를 구한다.
  • 현재 거리가 한 번에 뛰어서 갈 수 있는 거리보다 크거나 같을 수도 있고 더 작을 수도 있다.
  • 현재 거리가 더 크거나 같다면 나올 수 있는 경우
    • 최대한 도착지점 방향으로 일직선으로 많이 뛰어서 이동하고 남은거리 걷기
    • 도착지점까지 뛰어서만 갈 수 있도록 한 번 뛸때마다 방향 살짝씩 돌려서 뛴다. 즉 일직선으로 뛸 때 보다 한 번 더 뛰어서 도착지점 도착하기
    • 걸어서 도착하기
  • 현재 거리가 더 작다면 나올 수 있는 경우
    • 한번 오바해서 뛰고 남은거리 되돌아오면서 걷기
    • 방향 조금씩 틀어서 2번 뛰기
    • 걸어서 오기
  • 문제를 처음에 바르게 이해하기 힘들 뿐더러 경우의 수를 나누는 경우도 쉽지 않았다.
  • 구현은 어렵지 않으나 조금 두려운 문제

 

CODE

import sys
input = sys.stdin.readline
import math
x, y, d, t = map(int, input().split())
dist = math.sqrt(x**2+y**2)

if dist >= d:
    answer = min(t*(dist//d)+dist%d, t*(dist//d+1),dist)
else:
    answer = min(t+(d-dist), 2*t,dist)
print(answer)

 

 

728x90
반응형

댓글