백준 문제 풀이 - 피로도 22864번

Joonyeol Sim👨‍🎓·2021년 10월 9일
0

백준문제풀이

목록 보기
9/128

📜 문제 이해하기

하루에 한 시간 단위로 일을 하거나 일을 쉬어도 된다. 하루에 한 시간 일하면 피로도는 AA 만큼 쌓이고 일은 BB 만큼 처리할 수 있다.
만약에 한 시간을 쉰다면 피로도는 CC 만큼 줄어든다. 단, 피로도는 절대 0보다 작아질 수 없다. 당연히 일을 하지 않고 쉬었기 때문에 처리한 일은 없다.
피로도를 최대한 MM 을 넘지 않게 일을 하려고 한다. MM 를 넘기면 일하는데 번아웃이 와서 이미 했던 일들도 다 던져버리고 일을 그만두게 된다.
번아웃이 되지 않도록 일을 할때 하루에 최대 얼마나 일을 할 수 있는지 구해보자.

💡 문제 재정의

  1. 하루는 총 24시간이다.
  2. 일을 x시간만큼 한다면 쉬는 시간은 24 - x이다.
  3. 피로도는 Ax이며 이는 M을 넘으면 안된다.
  4. C * (24 - x)만큼 피로도가 주는데 음수가 나올때 피로도는 0이 된다.
  5. 일을 한 시간을 구한 뒤 B를 곱하면 총 일이 나온다.

✏️ 계획 수립

  1. 피로도와 일을 0으로 초기화 한다.
  2. 1 ~ 24시까지 쉴지 일할지 결정할 수 있도록 루프를 돈다.
  3. 만약 피로도 + A가 M보다 작다면 피로도에 A를 더하고 work에 B를 더한다.
  4. 그렇지 않으면 피로도에서 C만큼 빼고 쉰다. 이때 피로도가 0보다 작다면 0으로 맞춰준다.
  5. 마지막 work를 출력한다.

💻 계획 수행

if __name__ == '__main__':
    A, B, C, M = map(int, input().split())

    fatigue = 0
    work = 0
    for i in range(1, 25):
        if fatigue + A <= M:
            fatigue += A
            work += B
        else:
            fatigue -= C
            if fatigue < 0:
                fatigue = 0
    print(work)

🤔 회고

원래는 수학공식을 활용해 O(1)시간으로 풀려고했다.
피로도 = Ax - C(24 - x) <= M
일 = Bx
이때 가장 큰 정수 x를 구해서 문제를 풀려했으나 피로도가 음수가 되면 0으로 맞춰줘야 하는 부분에 문제가 있었는지 항상 84퍼에서 틀렸다고 나오게 되었다.
때문에 반복문으로 문제를 풀게되었다.

profile
https://github.com/joonyeolsim

0개의 댓글