알고리즘

백준 14651번 걷다보니 신천역 삼 (JAVA)

박카스마시며코딩 2023. 7. 1. 17:47

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