자료구조/문제풀이

[백준 JAVA] 22864 피로도

휴먼코딩 2024. 8. 11. 03:44

22864 피로도

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

문제설명

하루 24시간 동안 작업을 수행하는 과정에서 피로도가 증가하고 감소하는 방식에 따라 최대 작업량을 계산한다.

 

  • 피로도 증가량 (A): 작업을 할 때마다 증가하는 피로도
  • 작업량 (B): 한 시간 동안 작업할 때 증가하는 작업량
  • 피로도 감소량 (C): 피로도가 최대치를 넘는 경우 감소하는 피로도
  • 최대 피로도 (M): 피로도의 최대치로, 이 값을 넘으면 피로도가 감소해야 함

 

접근방식

O(1)  상수 시간복잡도

  • 반복문 내에서 사칙연산을 수행한다

문제 조건 분석 과정

 

피로도 증가: 현재 피로도 + A가 최대 피로도 M을 넘지 않으면 작업을 계속하고 피로도를 증가시킨다.

피로도 감소: 현재 피로도 + A가 M을 넘는 경우, 작업을 중단하고 피로도를 감소한다.

감소된 피로도는 0보다 작아지지 않도록 한다.

전체코드

import java.util.*;
import java.io.*;

public class Main_22864피로도 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] inputs = br.readLine().split(" ");
        int A = Integer.parseInt(inputs[0]); //작업마다 증가하는 피로도
        int B = Integer.parseInt(inputs[1]); //한 시간 작업의 작업량
        int C = Integer.parseInt(inputs[2]); //피로도가 감소하는 양
        int M = Integer.parseInt(inputs[3]); //최대 피로도

        int currentFatigue = 0;
        int totalWorkDone = 0;
        int hoursInADay = 24; //하루의 총 시간

        //하루 24시간 동안의 작업과 피로도
        for (int i = 0; i < hoursInADay; i++) {
            //현재 피로도와 작업 피로도를 더했을 때 최대 피로도를 넘지 않는 경우
            if (currentFatigue + A <= M) {
                currentFatigue += A; //피로도 증가
                totalWorkDone += B; //작업량 증가
            } else {
                //피로도가 최대치를 넘는 경우 피로도 감소 (휴식)
                currentFatigue -= C;
                //음수 방지
                if (currentFatigue < 0) {
                    currentFatigue = 0;
                }
            }
        }

        System.out.println(totalWorkDone);
    }
}