[다이나믹 프로그래밍]N으로 표현-파이썬

seo·2021년 10월 18일
0

📓Programmers

목록 보기
2/11

다이나믹 프로그래밍

📌최적의 해를 구하기에 시간이 매우 많이 필요하거나 메모리 공간이 매우 많이 필요한 문제
📌작은 문제에서 구한 답이 큰 문제에서 그대로 사용될 수 있으면 다이나믹 프로그래밍을 생각해보자

문제

아래와 같이 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 합니다.

입출력 예

Nnumberreturn
5124
2113

풀이

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] 다 해줘야했다.

0개의 댓글