알고리즘 문제(SOL)
[백준/1173/파이썬] 운동
Mapin
2022. 4. 2. 19:51
https://www.acmicpc.net/problem/1173
Problem
- 영식이가 운동을 하는 과정은 1분 단위로 나누어져 있다. 매 분마다 영식이는 운동과 휴식 중 하나를 선택해야 한다.
조건
- 운동을 선택한 경우, 영식이의 맥박이 T만큼 증가한다. 즉, 영식이의 맥박이 X였다면, 1분 동안 운동을 한 후 맥박이 X+T가 되는 것이다.
- 단, 영식이는 맥박이 M을 넘는 것을 원하지 않기 때문에, X+T가 M보다 작거나 같을 때만 운동을 할 수 있다.
- 휴식을 선택하는 경우 맥박이 R만큼 감소한다. 즉, 영식이의 맥박이 X였다면, 1분 동안 휴식을 한 후 맥박은 X-R이 된다.
- 단,맥박은 절대로 m보다 낮아지면 안된다. 따라서, X-R이 m보다 작으면 맥박은 m이 된다.
- 첫째 줄에 운동을 N분하는데 필요한 시간의 최솟값을 출력한다.. 만약 운동을 N분 할 수 없다면 -1을 출력한다.
SOL
운동할 수 없는 조건을 찾는게 바로바로 떠오르지는 않는 문제였다. 그리고 , IF 조건을 어디에서 줄지가 고민이 되는 문제였다.
문제를 풀다보면, 논리적인 흐름에서 IF(분기)를 어디서 발생시키는지 정하는게 어려울 때가 있다! 귀찮지만 그럴땐, Flow chart를 통해서 순서도를 그려보는 방법을 추천한다.
Trouble Shooting
이 문제에서 운동을 하는 조건은 heart_beat+T <=M 이고, 운동한 횟수가 N이 될때까지 반복을 할거다.
운동을 한 횟수가 N이 될때 까지 반복한다는 건, while문으로 표현한다면 아래의 의사코드 처럼 표현할 수 있을거다.
while exercise<N:
if 운동하는 경우:
심장박동 = 심장박동 + T
exercise +=1
시간 +=1
...
문제는, 운동을 하지 못하는 경우를 생각해보자.
첫 운동때, M을 넘어 버리면, 이 경우는 아무리해도 우리는 운동을 할 수 없다. 예를 들어보자.
Input
1 80 120 41 11
우리는 의기양양하게 가서 딱 운동을 하려고하는데, 80+41을하면, 운동을 시작도 못하게된다. 그렇다고, m보다 심장박동수를 낮출 수는 없다.
즉, 맨 처음에서 if를 통해서 한번 걸러줘야한다.
최종 코드를 보면 이해가 빠르게 될거다!
import sys
input =sys.stdin.readline
N,m,M,T,R=map(int,input().split())
Time=0
exercise=0
heart_beat=m
if m+T>M:
print(-1)
else:
while exercise<N:
if heart_beat+T<=M:
heart_beat+=T
Time+=1
exercise+=1
else:
heart_beat=max(heart_beat-R,m)
Time+=1
print(Time)