알고리즘/백준-파이썬
[백준] 9095번 (python 파이썬)
배불뚱이
2022. 4. 16. 14:33
https://www.acmicpc.net/problem/9095
9095번: 1, 2, 3 더하기
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
www.acmicpc.net
import sys
cache = [0] * 11
cache[1] = 1
cache[2] = 2
cache[3] = 4
for i in range(4, 11):
cache[i] = cache[i-1] + cache[i - 2] + cache[i - 3]
testcase = int(input())
for _ in range(testcase):
print(cache[int(sys.stdin.readline())])
입력데이터의 범위는 11미만의 양의 정수이다.
여러 테스트 케이스를 갖는 문제이므로 최대 입력 데이터인 10으로 한번 계산 해놓고 캐쉬를 만든 후에
입력 데이터에 따라 캐쉬에 있는 데이터를 출력한다.
- 부분 반복 구조 : cache[ i ] = cache[ i - 1 ] + cache[ i - 2 ] + cahce[ i - 3 ]
- 최적 부분 구조 : 최적의 cache[ i - 1 ] 값과 최적의 cache[ i - 2 ] 값과 최적의 cahce[ i - 3 ] 값을 더하면 최적의 cache[ i ] 값이 나온다. 애초에 각각의 입력에 대해 한가지의 값만 가능하다.
- 메모이제이션 : 입력데이터의 범위가 1이상 11미만이므로 인덱스 0을 제외한 총 10개의 캐쉬를 만든다.
- 접근 방식 : cache[1]과 cache[2]와 cache[3]을 알고있으므로, bottom - up 방식을 이용한다.
다음은 top - down 방식으로 코딩한 코드이다.
import sys
testcase = int(input())
numbers = [int(sys.stdin.readline()) for _ in range(testcase)]
cache = [0] * (max(numbers) + 1)
def get_cache(n):
if cache[n]:
return cache[n]
elif 1 <= n <= 2:
cache[n] = n
elif n == 3:
cache[n] = 4
else:
cache[n] = get_cache(n-1) + get_cache(n-2) + get_cache(n-3)
return cache[n]
for i in numbers:
print(get_cache(i))