본문 바로가기
코딩테스트 연습/백준 Boj

[Python] 백준 22864번 (피로도)

by Lagooni 2021. 11. 29.

문제

하루에 한 시간 단위로 일을 하거나 일을 쉬어도 된다. 하루에 한 시간 일하면 피로도는A 만큼 쌓이고 일은 B 만큼 처리할 수 있다.

만약에 한 시간을 쉰다면 피로도는 C 만큼 줄어든다. 단, 피로도는 절대 0보다 작아질 수 없다. 당연히 일을 하지 않고 쉬었기 때문에 처리한 일은 없다.

피로도를 최대한 M 을 넘지 않게 일을 하려고 한다. M 를 넘기면 일하는데 번아웃이 와서 이미 했던 일들도 다 던져버리고 일을 그만두게 된다.

번아웃이 되지 않도록 일을 할때 하루에 최대 얼마나 일을 할 수 있는지 구해보자.

입력

첫 번째 줄에 A, B, C, M이 공백으로 구분되어 주어진다. (하루는 24시간이다.)

맨 처음 피로도는 0이다.

출력

하루에 번 아웃이 되지 않도록 일을 할 때 최대 얼마나 많은 일을 할 수 있는지 출력한다.

제한

  •  1≤A≤1,000,000
  •  1≤B≤10,000
  •  1≤C≤10,000
  •  1≤M≤1,000,000

예제 입력 1

5 3 2 10

예제 출력 1

24

예제 입력 2

10 5 1 10

예제 출력 2

15

예제 입력 3

11 5 1 10

예제 출력 3

0

풀이 방법

  • 소소한 함정? 이 있다. 
    • 피로도는 절대 0보다 작아질 수 없다.
  • 한시간마다 체크한다.
    • 일한다면 피로도가 피로도 최대치(M)을 초과하지 않을까?
    • 그렇다면 일의 양을 더한다.
    • 그렇지 않다면 일을 쉬어 피로도-C를 해준다
      • 단, 피로도가 0보다 작아질 상태라면 0을 유지해준다.
import sys

# 피로도는 0보다 작아질 수 없다. (1시간일하면 A만큼 피로도 쌓이고 B만큼 처리가능) 1시간 쉬면 C만큼 피로도 줄어듬 처리한 일은 0
# 피로도 M넘으면 번아웃

p = 0
value = 0

A, B, C, M = map(int, sys.stdin.readline().rstrip().split())

for i in range(24):
    if p+A <= M:
        p = p+A
        value += B
    else:
        if p-C >= 0:
            p = p-C
        else:
            p = 0

print(value)

 

댓글