728x90
1351번: 무한 수열
첫째 줄에 3개의 정수 N, P, Q가 주어진다.
www.acmicpc.net
🤔 문제분석
다이나믹프로그래밍 + 깊이우선탐색으로 문제를 해결 할 수 있습니다.
깊이 우선탐색을 하게되면 P와 Q가 2이상이기때문에 지수시간이 됩니다. N이 10^12 이므로 O(N)으로는 문제를 해결 할 수 없습니다.
다이나믹 프로그래밍을 처음에는 배열을 N크기만큼 생성했었는데 N의 크기만큼 생성하지않고 딕셔너리 자료구조를 활용하였습니다. 딕셔너리 자료구조도 마찬가지로 메모리 크기가 지수의 크기만큼 생성되기때문에 훨씬 효율적입니다.
💻 코드
import sys
from collections import defaultdict
input = sys.stdin.readline
N, P, Q = map(int, input().split())
dp = defaultdict(int)
def A(num):
if num == 0:
dp.setdefault(num, 1)
return 1
if num in dp:
return dp[num]
left = num // P
right = num // Q
dp.setdefault(num, A(left) + A(right))
return dp[num]
print(A(N))
🎯 피드백 및 개선사항
처음에는 배열을 사용하여 문제를 해결하려고 했는데 메모리가 자꾸 터지는겁니다 😢 그래서 무슨 방법이 있을까해서 탐색을 하는 과정이 지수시간임으로 메모리도 지수시간만큼만 필요하다는것을 깨닫았습니다. 배열이 엄청나게 큰 수가 필요할경우 다음에는 어떻게 풀어야할지도 고민해봐야 될 것 같습니다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 16724번 : 피리부는사나이 (1) | 2024.02.24 |
---|---|
[백준] 14725번 : 개미굴 (1) | 2024.02.24 |
[백준] 16562번 : 친구비 (0) | 2024.02.24 |
[백준] 1525번 : 퍼즐 (0) | 2024.02.24 |
[백준] 6198번 : 옥상 정원 꾸미기 (0) | 2024.02.23 |