승코딩당당당

[C++] 백준 22864: 피로도 본문

PS/BOJ

[C++] 백준 22864: 피로도

승코딩당당당 2026. 2. 1. 19:03

문제

[C++] 백준 22864: 피로도 BRONZE 2
https://www.acmicpc.net/problem/22864

 


 

접근 방법

이 문제는 하루 24시간 동안 일을 할지, 쉴지 선택하면서
피로도 한도(m)를 넘지 않도록 하면서 최대한 일을 많이 하는 시뮬레이션 문제다.

 

  • 한 시간 일하면
    • 피로도 a 증가
    • 일량 b만큼 증가
  • 한 시간 쉬면
    • 피로도 c만큼 감소 (단, 0 미만으로는 내려가지 않음)
  • 피로도가 m을 초과하면 더 이상 일할 수 없다.

 

그래서 하루 24시간을 1시간 단위로 반복하면서,

  1. 현재 피로도 now에 a를 더했을 때 m 이하여야 일을 할 수 있다.
    • now + a <= m 이면 → 일하기
    • 아니면 → 쉬기
  2. 일을 한 시간은 cnt를 1 증가
  3. 모든 시간이 끝나면 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