📝 문제
💡 영식이가 운동을 하는 과정은 1분 단위로 나누어져 있다.
매 분마다 영식이는 운동과 휴식 중 하나를 선택해야 한다.
운동을 선택한 경우, 영식이의 맥박이 T만큼 증가한다.
즉, 영식이의 맥박이 X였다면, 1분 동안 운동을 한 후 맥박이 X+T가 되는 것이다.
영식이는 맥박이 M을 넘는 것을 원하지 않기 때문에, X+T가 M보다 작거나 같을 때만 운동을 할 수 있다.
휴식을 선택하는 경우 맥박이 R만큼 감소한다.
즉, 영식이의 맥박이 X였다면, 1분 동안 휴식을 한 후 맥박은 X-R이 된다.
맥박은 절대로 m보다 낮아지면 안된다. 따라서, X-R이 m보다 작으면 맥박은 m이 된다.
영식이의 초기 맥박은 m이다.
운동을 N분 하려고 한다.
이때 운동을 N분하는데 필요한 시간의 최솟값을 구해보자.
운동하는 시간은 연속되지 않아도 된다.
⚙️ 입력 : 첫째 줄에 다섯 정수 N, m, M, T, R이 주어진다.
⚙️ 출력 : 첫째 줄에 운동을 N분하는데 필요한 시간의 최솟값을 출력한다.
만약 운동을 N분 할 수 없다면 -1을 출력한다.
1173번: 운동
첫째 줄에 다섯 정수 N, m, M, T, R이 주어진다.
www.acmicpc.net
✅ 풀이
N, m, M, T, R = map(int, input().split())
time = 0
work = 0
pulse = m
if m+T > M:
print(-1)
else:
while N > work:
if M >= pulse+T:
pulse += T
work += 1
time += 1
else:
pulse -= R
if m > pulse:
pulse = m
time += 1
print(time)
💡 우선 문제 조건에서 운동을 할 수 없는 경우는 -1을 출력하도록 했는데,
해당 경우는 시작 맥박 + 1분 운동 후 증가하는 맥박이 최대 맥박을 바로 넘는 경우이므로,
이 경우를 쓸데없이 반복이 늘어나는 것을 방지하고자 처음에 걸러내고 시작하였다.
총 운동시간이 N이 될 때까지 반복을 진행시켰으며,
운동 후의 맥박이 최대 맥박을 넘지 않는 선에서 운동을 진행시키며 운동시간과 진행시간을,
그리고 운동 진행이 불가능 할 때마다 바로바로 휴식을 진행시켜주며 진행시간을 누적했다.
휴식 후의 맥박이 시작 맥박보다 낮아지는 경우를 핸들링해주는 것도 잊지 않았다.