https://www.acmicpc.net/problem/14651
14651번: 걷다보니 신천역 삼 (Large)
욱제는 ‘삼’이란 음절을 참 좋아한다. 인삼, 홍삼, 해삼, 삼성, 이춘삼(李春森), 삼식이, 삼시세끼, ㄴㄴ 그거 안 삼, 삼과 죽음, 알았삼, 걷다보니 신천역 삼, 그리고 특히 일이삼을 좋아한다.
www.acmicpc.net
저는 DP를 이용하여 문제를 해결하였습니다.
3의 배수는 각 자리 수의 합이 3의 배수이면 3의 배수입니다.
dfs를 각 자리수의 합만을 인자로 보내고 뎁스가 n이고 3의 배수면 1을 리턴하도록 하였습니다.
dp는 뎁스에 대한 합입니다. 하지만 합은 3의 배수인지만 판별하기 위해 쓰이기 때문에 합%3에 해당하는 가지 수를 저장하였습니다.
package BOJ.dp;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.function.Function;
public class BOJ_14651 {
private static final int LIMIT = 1_000_000_000 + 9;
private static final int NOT_VALID = -1;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(br.readLine());
int[][] dp = new int[n][3];
for(int i = 0 ; i < n; i++){
Arrays.fill(dp[i],NOT_VALID);
}
int result = cal(0,0,n,dp);
System.out.println(result);
}
private static int cal(int depth,int sum, int n,int[][] dp) {
if(depth == n && sum % 3 == 0){
return 1;
}
if(depth == n){
return 0;
}
if(dp[depth][sum] != NOT_VALID){
return dp[depth][sum];
}
int result = 0;
for(int i = 0 ; i < 3; i++){
if(depth == 0 && i == 0){
continue;
}
result += cal(depth+1,(sum + i) % 3,n,dp) % LIMIT;
result %= LIMIT;
}
dp[depth][sum] = result;
return result;
}
}
'알고리즘' 카테고리의 다른 글
백준 1766번 문제집 (JAVA) (0) | 2023.07.03 |
---|---|
백준 1202번 보석 도둑 (JAVA) (0) | 2023.07.02 |
백준 5585번 거스름돈 (JAVA) (0) | 2023.06.30 |
백준 1189번 컴백홈 (JAVA) (0) | 2023.06.29 |
프로그래머스 콜라츠 수열 (JAVA) (0) | 2023.06.28 |