Notice
Recent Posts
Recent Comments
Link
승코딩당당당
[C++] 백준 22864: 피로도 본문
문제
[C++] 백준 22864: 피로도 BRONZE 2
https://www.acmicpc.net/problem/22864

접근 방법
이 문제는 하루 24시간 동안 일을 할지, 쉴지 선택하면서
피로도 한도(m)를 넘지 않도록 하면서 최대한 일을 많이 하는 시뮬레이션 문제다.
- 한 시간 일하면
- 피로도 a 증가
- 일량 b만큼 증가
- 한 시간 쉬면
- 피로도 c만큼 감소 (단, 0 미만으로는 내려가지 않음)
- 피로도가 m을 초과하면 더 이상 일할 수 없다.
그래서 하루 24시간을 1시간 단위로 반복하면서,
- 현재 피로도 now에 a를 더했을 때 m 이하여야 일을 할 수 있다.
- now + a <= m 이면 → 일하기
- 아니면 → 쉬기
- 일을 한 시간은 cnt를 1 증가
- 모든 시간이 끝나면 cnt * b가 총 일량이 된다.
즉, 그리디하게 “가능하면 무조건 일하고, 아니면 쉰다”를 그대로 구현한 시뮬레이션이다.
(문제 조건상 이 전략이 항상 최댓값을 만들어줌)
구현 시 주의할 점
- 하루는 정확히 24시간이므로 day를 24에서 시작해서 0이 될 때까지 감소시키며 반복한다.
- 쉴 때 피로도를 줄일 때는처럼 0 아래로 내려가지 않도록 처리해야 한다.
- 마지막에 출력할 값은 일한 시간(cnt) × 시간당 일량(b) 이라는 점을 잊지 말기.
코드
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int a = 0, b = 0, c = 0, m = 0;
cin >> a >> b >> c >> m;
int day = 24, now = 0, cnt = 0; // 24시간, 현재 피로도, 일 횟수
while (day > 0)
{
if (now + a <= m)
{
now += a;
cnt++;
}
else
{
if (now - c < 0)
now = 0;
else
now -= c;
}
day--;
}
cout << cnt * b;
}'PS > BOJ' 카테고리의 다른 글
| [C++] 백준 1946: 신입 사원 (2) | 2026.02.01 |
|---|---|
| [C++] 백준 5585: 거스름돈 (0) | 2026.02.01 |
| [C++] 백준 1541: 잃어버린 괄호 (2) | 2026.02.01 |
| [C++] 백준 1744: 수 묶기 (0) | 2026.02.01 |
| [C++] 백준 1715: 카드 정렬하기 (0) | 2026.01.31 |