본문 바로가기

Algorithm

집으로 (1069번) - 백준 (BOJ)

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

 

1069번: 집으로

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

www.acmicpc.net

 

 

백준 - 집으로 (1069번)

 

난이도 : Gold 3

알고리즘&자료구조 : 기하 (Geometry) & 구현 (Simulation)


★ 핵심 Idea ★

 

아래의 3가지 경우로 나눠서 각각 소요시간을 구한 후,

그 중 최단시간을 구하면 된다.

 

 

 

 

< 전체 코드 >

 

if __name__ == '__main__':
    X, Y, D, T = map(int, input().split())
    cur = pow(X**2 + Y**2, 0.5)
    ts = 0
    if D > T:
        if (2*D) < cur:
            step = ((cur - 2*D) // D) + 1
            cur -= step*D
            ts += step*T
        i = 0 if cur <= D else 1
        cur = min(
            ts + T*2,
            ts + (i+1)*T + ((i+1)*D - cur),
            ts + i*T + (cur - i*D)
        )
    print(cur)

 

① 현재 좌표 (X, Y)와 원점 (0, 0)와의 거리를 구하고 "cur"에 저장한다.

 

X, Y, D, T = map(int, input().split())
cur = pow(X**2 + Y**2, 0.5)

 

 

 

② 만약 D <= T 라면 점프를 할 이유가 없으므로, "cur"을 그대로 출력한다.

 

 

 

③ D > T 이고, 현재 위치 "cur"의 원점까지의 거리가 D*2 보다 멀다면

현 위치 "cur"을 D*2 보다 작을 때까지 점프시킨다.

 

이 때, 점프 횟수를 "step"에 저장하고,

점프 후의 현재 위치 "cur"을 최신화시킨 뒤

점프에 걸린 시간 또한 "ts"에 더해준다.

 

if D > T:
    if (2*D) < cur:
        step = ((cur - 2*D) // D) + 1
        cur -= step*D
        ts += step*T

 

 

 

④ 아래의 3 가지 경우 중, 가장 작은 소요시간을 출력하면 정답이 된다.

 

 

i = 0 if cur <= D else 1
cur = min(
    ts + T*2,
    ts + (i+1)*T + ((i+1)*D - cur),
    ts + i*T + (cur - i*D)
)