문제에서 주어지는 것은 N 밖에 없다.
출석, 지각, 결석
문제 조건
구해야 하는 것
문제 해결
❌나오는 경우들을 이해해보자
- late는 0 또는 1만 가능
abs는 0,1,2만 가능- abs가 0이거나 1일 경우 --> 현재도 abs 가능하며, abs ++ 를 넘김
abs가 2일 경우 --> 현재 abs 불가능하며, abs는 0을 넘김
late가 0인 경우 --> 현재도 late가능하며, late++를 넘김, abs는 0을 넘긴다. (연속이 깨졌기 때문)
late가 1인 경우 --> 현재 late 절대 불가능하며, 원래의 late(1)을 넘김.- 즉 종합하면! 현재에서 ,
late 선택 가능한 경우들 : late가 0인 경우만 가능
abs 선택 가능한 경우들 : abs가 0,1인 경우 가능.
O 선택이 가능한 경우들 : 위의 경우들에도 충분히 선택 가능하다.
late나 O를 선택 하는 경우 --> abs는 0을 넘겨야 한다.
또한 이 문제는 자료형도 고려해줘야한다. 💥💥 Long으로 해주더라도 값이 초과되 기 때문에 연산 과정 중간에서도 100만으로 나누는 것이 필요하다. 따라서 이러한 과정을 해 주어야 한다.
- (a+b)%m = (a%m + b%m)%m 이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main{
public static int n;
public static long [][][] cache = new long[1001][2][3]; // total, late, abs 이다. late는 0,1 가능 abs는 0,1,2 가능
public static void Setting() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
// Setting cache (value : -1)
for(int i=0;i<cache.length;i++){
for(int j=0;j<cache[0].length;j++){
Arrays.fill(cache[i][j],-1);
}
}
}
public static long dp(int total, int late, int abs){
if(total == n) return 1;
if(cache[total][late][abs]!=-1)return cache[total][late][abs];
long sum = 0 ;
long temp = 0;
// late나 O 선택시, 지각 연속이 깨지는 것이기 때문에 abs에는 0이 오게 된다.
// late는 전체에서 지각이 두 번 이상 있으면 안 되는 것 이기 때문에 , abs나 O를 선택한다고 late를 초기화시키진 않는다.
// late 선택도 가능한 경우
if(late == 0) {
temp = dp(total+1,late+1,0);
sum = proc(temp,sum);
}
// abs 선택도 가능한 경우
if(abs<2) {
temp=dp(total+1,late,abs+1);
sum = proc(temp,sum);
}
// O를 선택하는 경우
temp = dp(total+1,late,0);
sum = proc(temp,sum);
cache[total][late][abs]=sum;
//System.out.println("TOTAL "+total +", late: "+late+", abs: "+abs);
System.out.println("cache[total][late][abs] = " + cache[total][late][abs]);
return sum;
}
public static long proc(long temp, long sum){
temp %=1000000;
sum%=1000000;
return (temp+sum)%1000000;
}
public static void main(String[] args) throws IOException{
Setting();
dp(0,0,0);
System.out.println(cache[0][0][0]);
}
}