[다이나믹 프로그래밍]N으로 표현-파이썬
다이나믹 프로그래밍
📌최적의 해를 구하기에 시간이 매우 많이 필요하거나 메모리 공간이 매우 많이 필요한 문제
📌작은 문제에서 구한 답이 큰 문제에서 그대로 사용될 수 있으면 다이나믹 프로그래밍을 생각해보자
문제
아래와 같이 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은 1 이상 9 이하입니다.
- number는 1 이상 32,000 이하입니다.
- 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
- 최솟값이 8보다 크면 -1을 return 합니다.
입출력 예
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
💡TIL
eval()문자열로 된 식을 계산하는 파이썬 내장함수
처음에는 단순히 7개구할때 dp[6]과 dp[1]만 연산했다.
테스트케이스 4개가 통과하지 않아서 다시보니 dp[1]연산dp[6] dp[2]연산dp[5] dp[3]연산dp[4] 다 해줘야했다.
Author And Source
이 문제에 관하여([다이나믹 프로그래밍]N으로 표현-파이썬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@stseo012/파이썬다이나믹-프로그래밍-N으로-표현저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)