본문 바로가기
알고리즘

Python - 걷기 (1459) 그리디

by jun.s.gi 2023. 6. 5.
728x90

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

 

1459번: 걷기

세준이는 학교에서 집으로 가려고 한다. 도시의 크기는 무한대이고, 도시의 세로 도로는 모든 정수 x좌표마다 있고, 가로 도로는 모든 정수 y좌표마다 있다. 세준이는 현재 (0, 0)에 있다. 그리고 (

www.acmicpc.net

 

1. 도착 좌표의 x축 또는 y축을 만날 때까지 대각선 방향으로 올라갑니다.

 - 대각선 방향 -> min(w * 2, s)

 

2. 남은 거리를 대각선으로만 이동한 거리와 한 블록씩으로만 이동한 거리를 구하여 가장 작은 값을 구합니다.

 - 홀수라면 한 블록 더하고 구합니다.

 

import sys
x, y, w, s = map(int, sys.stdin.readline().strip().split())
ans = 0

# 질러서 가는 것이 더 빠른지 아닌지
up = min(w * 2, s)

# 대각선으로 도착지의 x 또는 y가 같아질 때까지 올라갑니다.
ans += up * min(x, y)

# x축 또는 y축에 도착했을 때 남은 거리
last = x - y if x - y >= 0 else (x - y) * -1

t1, t2 = 0, 0

# 도착지점까지 한 블록씩 움직였을 때
t1 = w * last

# 남은 거리가 홀수일 때 대각선으로만 갔을 때 시간
if last % 2 == 1:
    t2 = w
    t2 += s * (last - 1)
# 남은 거리가 짝수일 때 대각선으로만 갔을 때 시간
else:
    t2 = s * last

print(ans + min(t1, t2))
728x90