난이도 : Silver3
Link : https://www.acmicpc.net/problem/9095
Tag : 다이나믹 프로그래밍
풀이일자 : 2024년 9월 13일
N : 1, 2, 3으로 만들 정수
본 문제는 1, 2, 3으로 만들 수 있는 경우의 수를 구하는 문제이다.
순열과 조합으로 이 문제를 접근 가능하지만 순열을 구하는 과정에서 시간복잡도가 증가될 가능성이 있으므로 DP로 접근 가능하다.
본래 구했던 경우의 수에서 추가되는 경우의 수를 구한다는 것이 DP의 기본적인 개념으로 시간복잡도는 O(n)으로 생각 할 수 있다.
DP를 사용해서 접근할 예정이다.
예를 들어
1을 만들 수 있는 경우의 수는 1 이렇게 1개이다.
2를 만들 수 있는 경우의 수는 1+1 , 2 이렇게 2개이다.
3을 만들 수 있는 경우의 수는 1+1+1, 1+2, 2+1, 3 이렇게 4개 이다.
다음 문제에서 조건이 1, 2, 3을 이용해서 N을 만드는 것이다.
따라서
4를 만들 수 있는 경우의 수는 위에서 구한 1, 2, 3을 만들 수 있는 경우의 수에서 1과 3을 이용하는 경우의 수, 1과 2를 이용하는 경우의 수를 더한 값과 같다.
따라서 4를 만들 수 있는 경우의 수는 7가지가 된다.
한번더 5까지 진행한다면
4에서 1을 더하는 방법 (7가지)
3에서 2를 더하는 방법 (6가지)
2에서 3을 더하는 방법
4와 1를 사용하는것 7가지 + 3과 2를 사용하는것 6가지를 더해 13가지가 된다.
따라서 점화식을 만든다면
N = N-1 + N-2 + N-3 이라고 볼 수 있다.
n = int(input())
arr = [0] * 11
arr[1] = 1 # 1을 만들 수 있는 경우의 수
arr[2] = 2 # 2를 만들 수 있는 경우의 수
arr[3] = 4 # 3을 만들 수 있는 경우의 수
for i in range(4, 11):
arr[i] = arr[i - 1] + arr[i - 2] + arr[i - 3]
for i in range(0,n):
a = int(input())
print(arr[a])