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

 

22864번: 피로도

첫 번째 줄에 네 정수 $A$, $B$, $C$, $M$이 공백으로 구분되어 주어진다. 맨 처음 피로도는 0이다.

www.acmicpc.net

 

문제풀이

그리디 + 완전탐색 문제입니다.

처음에는 피로도가 0 아래로 떨어지면 0 이라는 조건을 생각하지 않고,

1시간 단위로 일을 체크하면서 가장 최대값을 구하기 위해 Greedy 하게 푸는 생각을 하지 않아서 아래처럼 1시간 일하고 체크하고, 1시간 일하고 체크하는 것을 생각못하고

전체적인 24시간을 기준으로 구할려고 했다가 이렇게 할경우 피로도 조건을 만족시키지 못한다는 꺠닫고 아래처럼 수정했습니다.

매번 상황에 따라 선택하는 로직을 짜면됩니다.

 

 

코드

public class Main {
public static int A, B, C, M;
public static int result = 0;
public static int x, y;
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());
simulate();
System.out.println(result);
}
public static void simulate() {
int currentWorkAmount = 0;
int currentTired = 0;
//24번 계산합니다.
for(int i=1;i<=24;i++) {
//다음 일을 하였을때 피로도가 M보다 작으면 일을하는게 맞다.
if(currentTired + A <= M) {
currentWorkAmount += B;
currentTired += A;
}
//다음 일을 하였을떄 피로도가 M보다 크다면 일을 멈추고 쉬어야한다.
else {
currentTired -= C;
if(currentTired < 0 ) currentTired = 0;
}
}
result = currentWorkAmount;
}
}

+ Recent posts