알고리즘

백준 1351번 무한 수열 (JAVA)

박카스마시며코딩 2022. 9. 7. 17:54

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

 

1351번: 무한 수열

첫째 줄에 3개의 정수 N, P, Q가 주어진다.

www.acmicpc.net

 

저는 DP를 이용하여 문제를 해결하였습니다.

n의 입력이 int를 넘기때문에 DP를 저는 Map을 이용해 표현했습니다.

Map에 있다면 계산하지 않고 그 값을 리턴하도록 하였습니다.

 

package BOJ.dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_1351 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Long> stoi = Long::parseLong;
        long n = stoi.apply(st.nextToken());
        long p = stoi.apply(st.nextToken());
        long q = stoi.apply(st.nextToken());
//        long[] dp = new long[n+1];
        Map<Long,Long> dp = new HashMap<>();
        long result = cal(n,p,q,dp);

        System.out.println(result);
    }

    private static long cal(long n, long p, long q, Map<Long,Long> dp) {
        if(n == 0){
            return 1;
        }
        if(dp.containsKey(n)){
            return dp.get(n);
        }
        dp.put(n,cal(n/p,p,q,dp) + cal(n/q,p,q,dp));
        return dp.get(n);
    }
}