다이나믹 프로그래밍
📌최적의 해를 구하기에 시간이 매우 많이 필요하거나 메모리 공간이 매우 많이 필요한 문제
📌작은 문제에서 구한 답이 큰 문제에서 그대로 사용될 수 있으면 다이나믹 프로그래밍을 생각해보자
아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다.
12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5
5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다.
이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요.
N | number | return |
---|---|---|
5 | 12 | 4 |
2 | 11 | 3 |
def solution(N, number):
dp = []
str_n = str(N)
# 9이상은 -1출력하므로 9개의 빈 배열
for _ in range(9):
dp.append([])
#사칙연산
oper = ['+','-','//','*']
#배열마다 해당 숫자만큼 붙인값 넣기 예)2->22
for i in range(1,9):
dp[i].append(int(str_n*i))
#N이 number와 같으면 return 1
if number in dp[1]:
return 1
#2번부터 8번까지
for k in range(2,9):
#예) N이 7일 경우
#dp[1]연산dp[6] dp[2]연산dp[5] dp[3]연산dp[4]해야함
#h의 범위 1,2,3
for h in range(1,k//2+1):
for a in dp[k-h]:
for b in dp[h]:
for i in oper:
#두 수중 큰 수가 앞에와야 나눗셈,뺄셈가능
rr = eval(str(max(a,b))+i+str(min(a,b)))
if rr != 0 :
dp[k].append(rr)
#답이 나오면 return k
if number in dp[k]:
return k
#8개까지 구하고도 없으면 -1 return
return -1
eval()문자열로 된 식을 계산하는 파이썬 내장함수
처음에는 단순히 7개구할때 dp[6]과 dp[1]만 연산했다.
테스트케이스 4개가 통과하지 않아서 다시보니 dp[1]연산dp[6] dp[2]연산dp[5] dp[3]연산dp[4] 다 해줘야했다.