[백준 22864번] 피로도
2022. 5. 10. 01:23ㆍ코딩 테스트(JAVA)/백준
문제
하루에 한 시간 단위로 일을 하거나 일을 쉬어도 된다. 하루에 한 시간 일하면 피로도는 A 만큼 쌓이고 일은 B 만큼 처리할 수 있다.
만약에 한 시간을 쉰다면 피로도는 C 만큼 줄어든다. 단, 피로도가 음수로 내려가면 0으로 바뀐다. 당연히 일을 하지 않고 쉬었기 때문에 처리한 일은 없다.
피로도를 최대한 M 을 넘지 않게 일을 하려고 한다. M 를 넘기면 일하는데 번아웃이 와서 이미 했던 일들도 다 던져버리고 일을 그만두게 된다.
번아웃이 되지 않도록 일을 할때 하루에 최대 얼마나 일을 할 수 있는지 구해보자. 하루는 24시간이다.
입력
첫 번째 줄에 네 정수 A , B , C , M 이 공백으로 구분되어 주어진다.
맨 처음 피로도는 0이다.
출력
하루에 번 아웃이 되지 않도록 일을 할 때 최대 얼마나 많은 일을 할 수 있는지 출력한다.
제한
- 1≤A≤1,000,000
- 1≤B≤10,000
- 1≤C≤10,000
- 1≤M≤1,000,000
예제 입력 1
5 3 2 10
예제 출력 1
24
예제 입력 2
10 5 1 10
예제 출력 2
15
예제 입력 3
11 5 1 10
예제 출력 3
0
문제 분석
완전 탐색 문제입니다.
실패 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main { // 백준 완전탐색 22864 피로도
static int A, B, C, M;
static int fatigue = 0; // 피로도
static int hour = 0; // 시간
static int work = 0; // 출력 : 최대 할 수 있는 일
static StringBuilder sb = new StringBuilder();
public static void work() {
while(hour < 24) {
if(A + fatigue <= M) { // 일 해야 함
fatigue += A;
work += B;
}else { // 쉬어야 함
fatigue -= C;
if(fatigue < 0) fatigue =0;
}
hour ++;
}
}
public static void main(String[] args) throws IOException {
// 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
System.out.print(sb.append(work));
}
}
에러 발생 원인 :
메인 메서드에서 work메서드로 이어주지 않았음
성공 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Fatigue { // [ 백준 완전탐색 22864 피로도]
static int A, B, C, M;
static int fatigue = 0; // 피로도(A,C,M)
static int hour = 0; // 시간
static int work = 0; // 출력 : 최대 할 수 있는 일(B)
static StringBuilder sb = new StringBuilder();
public static void work() {
while(hour < 24) {
if(A + fatigue <= M) { // 일 해야 함
fatigue += A;
work += B;
}else { // 쉬어야 함
fatigue -= C;
if(fatigue < 0) fatigue =0;
}
hour ++;
}
}
public static void main(String[] args) throws IOException {
Fatigue T = new Fatigue();
// 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
T.work();
System.out.print(sb.append(work));
}
}
확실히 입출력을 BufferedReader와 StringBuilder을 사용하니 다른 백준 문제를 제출했을 때 보다
속도가 빨라졌음을 느꼈습니다.
'코딩 테스트(JAVA) > 백준' 카테고리의 다른 글
[백준 2751번, 백준 10814번, LeetCode 179번] 정렬 문제 풀이 (0) | 2024.01.17 |
---|---|
[백준 1182번] 부분수열의 합 (0) | 2022.05.05 |
[백준 15652번] N과 M(4) (0) | 2022.05.03 |
[백준 15651번] N과 M(3) (0) | 2022.05.03 |
[백준 15650번] N과 M(2) (0) | 2022.05.03 |