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)
)
'Algorithm' 카테고리의 다른 글
숫자 게임 (2923번) - 백준 (BOJ) (0) | 2023.08.29 |
---|---|
쓰레기 치우기 (1736번) - 백준 (BOJ) (0) | 2023.08.26 |
창업 (16890번) - 백준 (BOJ) (0) | 2023.08.23 |
칵테일 (1033번) - 백준 (BOJ) (0) | 2023.08.22 |
깊콘이 넘쳐흘러 (17420번) - 백준 (BOJ) (0) | 2023.08.19 |