문제
https://www.acmicpc.net/problem/1563
1563번: 개근상
백준중학교에서는 학기가 끝날 무렵에 출결사항을 보고 개근상을 줄 것인지 말 것인지 결정한다. 이 학교는 이상해서 학생들이 학교를 너무 자주 빠지기 때문에, 개근상을 주는 조건이 조금 독
www.acmicpc.net
풀이 예상
dp배열의 의미는 dp[날짜][지각횟수][연속된결석횟수] 이다.
첫날부터 출석, 지각, 결석 인 경우를 체크하면서 dfs를 진행한다.
지각이 2번인경우 또는 결석이 연속으로 3번인 경우는 0을 리턴한다.
날짜가 N이 되었다면 1을 리턴한다.
dp배열을 처음에 전부 -1으로 초기화 해 두고
-1이 들어있다면 dfs로 찾고, -1이 아닌 값이 있다면 한번더 찾지말고 바로 그 값을 쓴다.(메모이제이션)
풀이방법 (접근 방법 & 시간복잡도)
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
static int N;
static int MOD = 1_000_000;
static int[][][] dp;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
dp = new int[N][2][3];
for (int i = 0; i < N; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 3; k++) {
dp[i][j][k] = -1;
}
}
}
System.out.println(find(0, 0, 0) % MOD);
}
static int find(int day, int late, int absent) {
if(late == 2 || absent == 3) {
return 0;
}
if(day == N) {
return 1;
}
if(dp[day][late][absent] == -1) {
int count = find(day+1, late, 0)%MOD + find(day+1, late+1, 0)%MOD + find(day+1, late, absent+1)%MOD;
count %= MOD;
dp[day][late][absent] = count;
return count;
}else {
return dp[day][late][absent];
}
}
}
결과
'Algorithm > java' 카테고리의 다른 글
백준 2040 JAVA : 수 게임 (1) | 2024.02.27 |
---|---|
백준 9657 JAVA : 돌 게임 3 (0) | 2024.02.25 |
SW Expert 12052 JAVA : 부서진 타일 (0) | 2024.02.22 |
백준 14677 JAVA : 병약한 윤호 (0) | 2024.02.21 |
백준 17351 JAVA : 3루수는 몰라 (0) | 2024.02.21 |