Algorithm/백준
[Python][백준] 9095번 문제 1, 2, 3 더하기 해결 | DP는 어려워
이무기뱀술
2022. 3. 12. 10:00
728x90
동적 계획법(dynamic programming, DP)
DP 큰 문제를 작은 문제로 나누어 푸는 알고리즘이다.
DP의 핵심 작은 부분을 기억하는 것이다.
왜냐하면 Optimal Structure가 있는 문제를 풀 때 구조를 새로 구할 필요없이, 방금 전 기억한 작은 부분을 불러오면 더 빠르고, 효율적으로 구할 수 있기 때문이다.
오늘은 DP를 이용하여 푼 1, 2, 3 더하기 문제를 풀어보겠다.
lines = int(input())
cases = list(int(input()) for _ in range(lines))
for c in cases:
dp = [0, 1, 2, 4] + [0 for _ in range(c)]
for i in range(4, c+1):
dp[i] = dp[i-3] + dp[i-2] + dp[i-1]
print(dp[c])
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
이 문제의 합의로 나타내는 방법은 순서가 있다.
정수 1, 2, 3은 숫자 1, 2, 3 중 하나만으로도 표현할 수 있으니 논외로 하자.
정수 4를 숫자 1, 2, 3의 합으로 나타내려면, 1, 2, 3 중 최소 2개 이상 사용하여야한다.
즉 정수 4의 경우의 수는
(정수 1의 합 + 정수 3의 합)
(정수 2의 합 + 정수 2의 합)
(정수 3의 합 + 정수 1의 합)
으로 나타낼 수 있다.
중복되는 경우를 제외하면, 정수 4의 합을 나타낼 수 있는 경우는
((정수 1의 합 + 정수 3의 합) + (정수 2의 합 + 정수 2의 합) + (정수 3의 합 + 정수 1의 합)) / 2
즉 정수 1의 합 + 정수 2의 합 + 정수 3의 합으로 나타낼 수 있고,
이것은
dp[4] = dp[1] + dp[2] + dp[3]
으로 코드를 쓸 수 있고
이것은
dp[i] = dp[i-3] + dp[i-2] + dp[i-1]
으로 일반화할 수 있다.
728x90