본문 바로가기

문제풀이

[백준] 1173번 파이썬 풀이

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

 

1173번: 운동

첫째 줄에 다섯 정수 N, m, M, T, R이 주어진다.

www.acmicpc.net

 

[문제]

영식이가 운동을 하는 과정은 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을 출력한다.

[제한]

ㅇ 1 ≤ N, T, R ≤ 200

ㅇ 50 ≤ m ≤ M ≤ 200

[예제 입력1]

5 70 120 25 15

[예제 출력1]

10

[예제 입력2]

100 50 100 5 200

[예제 출력2]

109

[예제 입력3]

1 60 70 11 11

[예제 출력3]

-1

[예제 입력4]

200 50 200 150 1

[예제 출력4]

30050

[예제 입력5]

19 89 143 17 13

[예제 출력5]

40

[힌트]


나의 풀이

 

N, m, M, T, R = map(int, input().split())

cnt = time = 0
sum = m
if m + T > M:
    print(-1)
else:
    while(True):
        if sum + T <= M:
            sum += T
            cnt += 1
            time += 1
        else:
            sum = max(sum-R, m)  
            time += 1
        
        if cnt == N:
            break
    print(time)

 

우선 문제를 풀기 전에 몇 가지 조건을 확인하고 가야 한다.

 

1. 영식이는 맥박이 최대 맥박(M)을 넘는 것을 원하지 않는다.
 - 1분동안 운동한 맥박(X+T)가 M보다 작거나 같을 때만 운동할 수 있다.

2. 영식이의 맥박이 초기 맥박(m)보다 작아지면 안된다.
 - 휴식을 선택하는 경우 (X-R)이 m보다 작으면 맥박은 m이 된다.

 

 이제 문제 해결을 위해 주어진 N(운동하는 시간(분)), m(초기 맥박), M(최대 맥박), T(운동하는 경우 증가하는 맥박), R(휴식하는 경우 감소하는 맥박) 총 5개의 변수를 선언하고 정수형(int)으로 받아준다.

 

N, m, M, T, R = map(int, input().split())

 

 그다음 몇 분 운동할 수 있는지 확인하는 변수(time)와 실제 운동을 실시하는 횟수(cnt), 초기 맥박의 변화를 알기 위한 변수(sum)를 선언 및 초기화해준다.

 

cnt = time = 0
sum = m

 

 만약 1회 시행 시 초기 맥박(m) + 운동할 때 증가하는 맥박(T)이 최대 맥박(M) 보다 크다면 운동을 진행할 수 있는 상태가 아니기 때문에 -1을 출력하고, 아니라면 반복문을 통하여 운동하는 시간을 구하도록 한다.

 - 파이썬은 max라는 함수를 이용하여 변화하는 맥박에 대한 정보를 쉽게 알 수 있다는 장점이 있는 것 같다.

 

if m + T > M:
    print(-1)
else:
    while(True):
        if sum + T <= M:
            sum += T
            cnt += 1
            time += 1
        else:
            #맥박 + 운동시 증가하는 맥박 > 최대맥박 일 경우 휴식
            #맥박 - R 이 m보다 작을때는 맥박이 m이기 때문에 max(맥박-R, m)으로 비교
            sum = max(sum-R, m)  
            time += 1
        
        if cnt == N:	#운동시간 카운터가 입력한 운동시간과 같다면 반복문 종료
            break

예제 2 결과