Baekjoon Algorithm/python
[Python]BAEKJOON 9095번 1,2,3 더하기
SeolLab.
2023. 1. 27. 17:26
728x90
https://www.acmicpc.net/problem/9095
9095번: 1, 2, 3 더하기
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
www.acmicpc.net
동적계획 알고리즘(Dynamic Programming(aka. DP))을 이용해서 푼다.
배열 d를 만들고, d[1]=1, d[2]=2, d[3]=4로 초기값을 설정한다. 3개나 초기값을 설정한 이유는 이 문제의 점화식이 다음과 같기 때문이다.
d[i] = d[i-1]+d[i-2]+d[i-3]
이 점화식이 유도되는 과정은 아래 예시를 참고.
i = 4일 때, d[4] = d[3]+d[2]+d[1]
i = 4일 때, d[4] = d[3]+d[2]+d[1]
4 =
(3) + 1 | d[3] = 4(개) | (1+1+1)+1 | (3)+1 | (2+1)+1 | (1+2)+1 |
(2) + 2 | d[2] = 2(개) | (1+1)+2 | (2)+2 | ||
(1) + 3 | d[1] = 1(개) | (1)+3 |
Try1 - runtime error 실패
import sys
input = sys.stdin.readline
res = []
for _ in range(int(input())):
n = int(input())
d = [0 for i in range(n+1)]
d[1],d[2],d[3] = 1,2,4
for i in range(4,n+1):
d[i] = d[i-1]+d[i-2]+d[i-3]
res.append(d[n])
print(*res,sep='\n')
-> runtime error(type error)가 발생하는 이유는 index error - 즉, n = 1 또는 2일 경우, 런타임 에러가 발생. d = [0 for i in range(n+1)]에서 range(2) 또는 range(3)이 되어 한줄에 초기화한 d[1],d[2],d[3] = 1,2,4 값들이 출력되지 않을 수 있음. 따라서 d = [0 for i in range(n+1)]와 같이 하지 않고, d=[0]*(max(4, n+1))라고 해주면, 최소 index = 0,1,2,3의 배열은 만들어지게 됨.
Sol1
import sys
input = sys.stdin.readline
res = []
for _ in range(int(input())):
n = int(input())
d = [0]*(max(4, n+1)) #이 부분만 수정
d[1],d[2],d[3] = 1,2,4
for i in range(4,n+1):
d[i] = d[i-1]+d[i-2]+d[i-3]
res.append(d[n])
print(*res,sep='\n')
Sol2
n은 11보다 작다는 조건에 따라 d=[0]*(max(4, n+1))라고 쓸 필요도 없이, d = [0]*11라고 쓰면 그만이다.
import sys
input = sys.stdin.readline
for _ in range(int(input())):
n = int(input())
d = [0]*11
d[1],d[2],d[3] = 1,2,4
for i in range(4,11): # 범위도 (4,11)로 바꿨다.
d[i] = d[i-1]+d[i-2]+d[i-3]
print(d[n])
Sol3
T = int(input())
lst = [int(input()) for i in range(T)]
d = [0]*11
d[1],d[2],d[3] = 1,2,4
for i in range(4,11):
d[i] = d[i-1]+d[i-2]+d[i-3]
for n in lst:
print(d[n])