[백준 1351] 무한 수열(Java)

최민길(Gale)·2023년 11월 19일
1

알고리즘

목록 보기
152/172

문제 링크 : https://www.acmicpc.net/problem/1351

이 문제는 재귀함수와 map을 이용하여 풀 수 있습니다.

무한수열 특성상 i를 파라미터로 가지는 재귀함수를 반복해서 return A(i/p) + A(i/q)를 이용하면 쉽게 결과를 구할 수 있습니다. 하지만 값이 충분히 크기 때문에 단순히 재귀로 반복하게 되면 시간 초과가 발생합니다.

이를 위해 map에 이미 연산을 실행한 결과를 저장하여 리턴합니다. i/p의 값을 키로, A(i/p)의 값을 벨류로 하여 저장한 후 재귀함수 연산을 수행하기 전 map을 우선탐색하여 값이 존재한다면 그 값으로 연산을 수행합니다.

다음은 코드입니다.

import java.util.*;
import java.io.*;

class Main{
    static long N,P,Q;
    static Map<Long, Long> check = new HashMap<>();

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Long.parseLong(st.nextToken());
        P = Long.parseLong(st.nextToken());
        Q = Long.parseLong(st.nextToken());

        System.out.println(solve(N));
    }

    static long solve(long idx){
        if(idx == 0) return 1;
        else return getSum(idx/P) + getSum(idx/Q);
    }

    static long getSum(long idx){
        long res = 0;
        if(check.containsKey(idx)) res = check.get(idx);
        else{
            res = solve(idx);
            check.put(idx, res);
        }
        return res;
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글