[BOJ] 백준_22864번_피로도_C/C++백준 알고리즘2021. 9. 27. 08:00
목차
문제 출처
https://www.acmicpc.net/problem/22864
문제
하루에 한 시간 단위로 일을 하거나 일을 쉬어도 된다. 하루에 한 시간 일하면 피로도는 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
코드
//[BOJ] 22864번_피로도
#include<iostream>
using namespace std;
int main()
{
int fatigue=0, time=0, work=0, rest=0, burnout=0;
int A, B, C, M;
cin >> A >> B >> C >> M;
rest = C;
burnout = M;
if (A > M) {
cout << 0 << endl;
exit(0);
}
while (1)
{
fatigue += A;
if (fatigue > burnout) {
fatigue -= A;
fatigue -= rest;
}
else
{
work+=B;
}
time++;
if (time == 24) {
cout << work << endl;
break;
}
}
return 0;
}
풀이 과정
우선 전체반복문 while(1)에서 진행되도록 작성했다. 변수 fatigue에 입력받은 피로도 값(A)을 먼저 더해준다. 만약 fatigue이 번아웃 값을 넘었을 경우, 일을 진행하지 못하므로 fatigue에서 A만큼 다시 빼줌으로써 원래대로 돌리고 휴식을 취하여 fatigue에서 rest만큼 감소시켜준다. fatigue이 번아웃 값을 넘지 않았을 경우에는 일을 제대로 수행한 것이므로 work 값에 한 시간 당 처리할 수 있는 일의 양인 B 만큼 더해준다. 어떤 경우든 한 시간은 지난 것이므로 time 값에 1을 더해준다. 만약 time값이 24가 되었을 경우 하루가 다 되었으므로 총 진행된 일의 양 work를 출력하고 반복문을 빠져나와 프로그램을 종료한다.
728x90
반응형
LIST
'백준 알고리즘' 카테고리의 다른 글
[BOJ] 백준_23028번_5학년은 다니기 싫어요_C/C++ (0) | 2021.09.29 |
---|---|
[BOJ] 백준_23055번_공사장 표지판_C/C++ (0) | 2021.09.28 |
[BOJ] 백준_2798번_블랙잭_C/C++ (0) | 2021.09.24 |
[BOJ] 백준_10972번_다음 순열_C/C++ (0) | 2021.09.22 |
[BOJ] 백준_1008번_A/B_C/C++ (0) | 2021.09.18 |
@kdj :: Childev'note
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!