본문 바로가기
기타/백준일지

[백준] 1351번 무한 수열

by 민지기il 2025. 2. 21.
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;

long long N, P, Q;
unordered_map<long long, long long> m;

long long solve(long long num){
    long long ret;
    if(m.find(num)!=m.end()){
        return m[num];
    }
    ret=solve(num/P) + solve(num/Q);
    m[num]=ret;
    return ret;
}

int main(){
    fastio;

    cin>>N>>P>>Q;
    m[0]=1;
    if(N==0)
        cout<<1;
    else
        cout<<solve(N/P)+solve(N/Q);
}

<참고>

https://allmymight.tistory.com/161

<풀이>

[메모이제이션]: 한 번 계산한 값을 저장해두고, 같은 계산이 필요할 때 다시 계산하지 않고 저장된 값을 사용하는 기법

중복 계산을 피하기 위한 기법임 

unordered_map: 키-값 쌍으로 데이터를 저장하는 해시 테이블 기반의 자료구조이다.

입력값을 키(Key)로 사용 → n, 계산 결과를 값(Value)로 사용 → fibo(n)의 결과

m[key] = value 형태로 간단하게 저장 가능, 같은 입력이 들어오면 저장된 값을 그대로 반환

 

m.find[num]: find-num이라는 키가 존재하면 해당 키를 가리키는 반복자 반환하고 없으면 m.end() 반환.

따라서 m.find(num) != m.end() num 대한 결과가 이미 존재한다는

 

 

'기타 > 백준일지' 카테고리의 다른 글

[프로그래머스] 60060번  (0) 2025.03.11
[백준] 11657번 타임머신  (0) 2025.03.10
[백준] 2225번 합분해  (0) 2025.02.20
[백준] 9251번 가장 긴 증가하는 수열  (0) 2025.02.20
[백준] 11404번 플로이드-마샬  (0) 2025.02.18