[백준 BOJ] 22864번 피로도 (C++/cpp)

2024. 5. 26. 15:43PS (Program Solving)/BOJ (백준)

문제 설명

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

 

백준 BOJ 22864번 피로도 문제 사진1
백준 BOJ 22864번 피로도 문제 사진2

 

접근 방법 - 시뮬레이션을 활용한 사칙연산 문제

백준의 22864번 문제는 시뮬레이션을 이용하여 쉽게 해결할 수 있는 연산 문제이다.

해당 문제는, 피로도와 업무량에 관련한 정보가 입력으로 주어질 때 24시간 동안 최대한 할 수 있는 업무량을 구하여 출력해야 하는 문제이다.

이때 각 입력값은 아래를 의미한다. (입력받는 순서도 아래의 순서를 따른다.)

  • A, B :: "1시간 동안 B만큼의 업무량을 처리하는 데에 A만큼의 피로도가 쌓인다."
  • C :: "1시간을 소모하여 휴식하면 C만큼의 피로도가 줄어든다."
  • M :: "M만큼 피로도가 누적되면 안 된다. 피로도가 M을 초과하면 번아웃이 와서 다 때려치운다."

필자는 위 입력값 정보들을 참조하며, 1시간 단위로 끊어가며 피로도에 대한 연산을 반복 수행하였다.

이때 피로도가 M 직전까지 다다르면 휴식을 취하고, 아니라면 업무를 수행하는 식으로 코드를 작성하였다.

자세한 설명은 아래에 적어놓으니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해 보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) a, b, c, m에 대한 값을 순서대로 입력받는다.

 

2) 만약 a가 m을 초과하는 값을 갖고 있다면, 이 경우엔 애초에 업무를 원활히 수행할 수 없는 상황임을 의미한다.

따라서 이때엔, 문제의 조건에 나와있는 것처럼 0을 출력하고 즉시 프로그램을 실행 종료하도록 한다.

 

3) time, sum, result 변수를 각각 선언하고, 모두 0으로 초기값을 설정해 둔다.

  • time :: 1시간 단위로 끊어가며 피로도 연산을 할 때, 현재까지 소요된 시간을 저장한다.
  • sum :: 1시간 단위로 끊어가며 피로도 연산을 할 때, 현재까지 누적된 피로도를 저장한다.
  • result :: 현재까지 수행한 업무량을 저장하고, 이를 통해 정답을 출력할 예정이다.

 

4) 반복문을 활용하여 아래의 연산을 취한다.

(1시간 단위로 반복문 한 바퀴를 돌게끔 하였고, time이 24와 값이 같아지면 반복문을 종료하도록 하였다.)

- 만약 sum+a가 m을 초과한다면, 이는 일을 더 했다가는 번아웃이 올 수 있는 상황임을 뜻한다.

따라서 이 경우에는 휴식을 취하게끔 해야 한다. 현재 sum값에 c를 빼고, 만약 그 결과가 음수라면 0으로 값을 재설정하도록 한다. (문제의 조건에 정의되어 있는 것처럼, 피로도는 음수값을 가질 수 없다.)

- sum+a가 m 이하라면, 이는 아직 일을 더 할 수 있는 상황임을 뜻한다.

따라서, sum에 a를 더하고 result에는 b를 더하도록 한다.

- 반복문 한 바퀴를 돌 때마다 1시간씩 소요되어야 하므로, 반복문 한 바퀴를 돌 때마다 time에 1을 추가한다.

 

5) 위 연산을 모두 완료하였다면, 최종적으로 저장된 result 값을 출력한 뒤 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;

//백준 22864번 코드
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);   cout.tie(NULL);
    
    int a, b, c, m;
    cin >> a >> b >> c >> m;
    if (a > m) {
        cout << 0 << endl;
        return 0;
    }
    
    int time = 0;
    int sum = 0;
    int result = 0;
    while (time < 24) {
        if (sum + a > m) {
            sum -= c;
            if (sum < 0) { sum = 0; }
        }
        else {
            sum += a;
            result += b;
        }
        time++;
    }
    cout << result << endl;
}

 

제출 결과

백준 BOJ 22864번 피로도 문제 C++ 제출 결과

(2023.11.07 백준 22864번 문제 제출 결과)

1일1솔 잠에 쫓기며 했던 흔적..

반응형