안경잡이 구루루

백준 22864 (피로도) [Python/파이썬] [Greedy/그리디] 본문

파이썬(Python)/문제풀이(백준,BaekJoon)

백준 22864 (피로도) [Python/파이썬] [Greedy/그리디]

구루루(gururu) 2023. 10. 8. 17:45
반응형

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

 

22864번: 피로도

첫 번째 줄에 네 정수 $A$, $B$, $C$, $M$이 공백으로 구분되어 주어진다. 맨 처음 피로도는 0이다.

www.acmicpc.net

 


나:

a,b,c,m = map(int,input().split())
stress = 0
work = 0
hours=24

while hours !=0:
    if a > m:
        break
    elif stress+a > m:
        stress -=c
        hours -=1
        if stress <0:
            stress=0
    else:
        stress +=a
        work +=b
        hours -=1
print(work)

완성된 코드는 위와 같다.

 

(1)
a,b,c,m = map(int,input().split())
stress = 0
work = 0
hours=24

 

a, b, c, m 을 사칙연산에 이용하기 위해 빈칸을 기준으로 모두 정수값으로 입력받는다.

피로도는 stress, 최대 일은 work,  하루 24시간은 hours 변수에  담아 기본적인 설정했다.

 

(2)
while hours !=0:
    if a > m:
        break
    elif stress+a > m:
        stress -=c
        hours -=1
        if stress <0:
            stress=0
    else:
        stress +=a
        work +=b
        hours -=1
print(work)

설명에 앞서서 잠시 내가 문제 풀때 막혔던 부분에 대해 얘기하자면 

"피로도 M을 넘지 않는 않게 일을 한다" 것의 정확한 의미였다. M만 안넘게 일과 휴식을 '같이'하면 되겠다 싶어서 첨에 코드를 짤 떄는 일과 휴식에 의한 피로도 값 a-c를 한번에 계산후 hours -2 를 했는데 이 때문에 자꾸 예제3의 경우를 이해 못하고 해맸던 바보짓을 했다. 일과 휴식을 동시에 할 수 없다라고 생각하면 바로 알아차렸을 텐데... 

아무튼 이제 위 (2) 코드에 대해 설명하자면

최대한 많은 일을 하기 위해서 1. 하루 24시간을 다 사용,  2. stress >m  인 상황을 만들지 않기   를 반드시 고려해야한다.

그래서 반복문 while 을 이용해 하루 24시간을 다 사용해 0 이 될 때까지 반복했다.

이때 일을 한 후 받는 피로도 a 가 번아웃 기준인 m보다 큰 경우 예제 3처럼 반복문을 종료시켜 0을 출력시킨다.

크지 않은 경우엔 일을 한 후 받는 피로도 a와 현재 피로도인 stress의 합이 m 을 넘지 않게 elif 구문을 이용해  한 시간당 c 를 빼준다. 이는 a 를 stress에 더했을 때  m 을 넘지 않을 정도로만 c 를 빼기에 최소한의 시간을 이용해 휴식을 하고 최대한 많은 일을 할 수 있게 된다. 

이때 일을 통해 얻는 피로도 a 보다 휴식을 통해 뺴는 피로도 c가 더 큰 경우가 있을 수 있다. 그래서 문제에 나온 것처럼 피로도가 음수로 내려가면 0 으로 바꿔주는 코드를 현재 피로도에서 c 를 뺄때 if 를 통해 구현한다. 

이외에 경우에는 else 구문을 통해 일한 시간과 피로도를 누적해서 더해준다.

최종적으로 최대한 많은 일을 한 시간이 work 에 담기고 이를 print해서 출력한다. 

반응형