본문 바로가기
알고리즘 문제/백준

[백준] 22864번: 피로도 (Java)

by Lpromotion 2024. 8. 8.

1. 문제설명

하루 한 시간 일하면 피로도가 A만큼 쌓이고 일은 B만큼 할 수 있다.

만약 한 시간을 쉰다면 피로도는 C만큼 줄어든다. 피로도가 음수가 되면 0으로 바뀐다.

피로도를 M이 넘지 않고 하루에 최대 일할 수 있는 시간을 구하는 문제이다.

(하루는 24시간, 맨 처음 피로도는 0)

  • 시간 제한: 1초
  • 메모리 제한: 1024MB

 

2. 접근 방식

=> 완전탐색 방법으로 1부터 24(하루)까지 일한 경우와 하지 않은 경우의 피로도를 계산한다.

  • for문으로 1부터 24까지(하루)
  • 한 시간 일했을 때의 피로도를 계산하여 (next)
    • next가 최대 피로도 M보다 작거나 같으면 결과값에 B를 더하고, 피로도를 A만큼 증가시킨다.
    • next가 최대 피로도 M보다 크면 피로도를 C만큼 감소시킨다.
      • 만약 C만큼 감소시킨 피로도가 음수가 되면 0으로 재설정한다.

 

3. 최종 코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int A = Integer.parseInt(st.nextToken()); // 한 시간 일할 때 쌓이는 피로도
        int B = Integer.parseInt(st.nextToken()); // 한 시간 일할 때 처리할 수 있는 일
        int C = Integer.parseInt(st.nextToken()); // 한 시간 쉴 때 줄어드는 피로도
        int M = Integer.parseInt(st.nextToken()); // 최대 피로도

        int tired = 0; // 피로도
        int work = 0; // 일하는 시간 (결과값)
        for(int i=1; i<=24; i++) { // 24시간
            int next = tired + A; // 한 시간 일했을 때 피로도
            if(next <= M) { // next가 최대 피로도보다 낮으면
                work += B; // 일하는 시간 1시간 증가시킴
                tired += A; // 피로도 A만큼 축적
                continue;
            } else if(next > M) { // next가 최대 피로도보다 크면
                tired -= C; // 피로도 C만큼 감소
                if(tired < 0) tired = 0; // 만약 피로도가 음수가 되면 0으로 설정
                continue;
            }
        }

        System.out.println(work);
    }
}

반응형

댓글