03-02 N으로 표현 - DP

2022. 4. 12. 17:15알고리즘/커뮤러닝

문제 설명

아래와 같이 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

 

제한사항

  • N은 1 이상 9 이하입니다.
  • number는 1 이상 32,000 이하입니다.
  • 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
  • 최솟값이 8보다 크면 -1을 return 합니다.

DP로 푸는건 알았는데....................어려워 못풀었다

Dynamic Programming (동적계획법)

: 주어진 최적화 문제를 재귀적인 방식으로 부분문제로 만들어 부분문제를 풀고 해를 조합해 전체 문제의 해답에 이르는 방식
알고리즘 진행에 따라 탐색해야할 범위를 동적으로 결정 > 탐색범위를 한정시킴

 

✔ 동적계획법으로 설계

N을 한번 사용해서 만들수 있는 수

N을 두번 사용해서 만들 수 있는 수

...

 

N=5 일 경우

사용한 횟수  

1 : 5

2 : 55

   & 1 (+, -, *, /) 1 -> 5 + 5, 5 - 5, 5 * 5, 5 / 5 = 10, 0, 25, 1

3  : 555

   & 1 ( + - * / ) 2 & 2 ( + - * / ) 1 = 60, 15, 5, 30, 6, -50, -5, -20, 4, 275, 50, 0, 125, 11, 2, 20, -4,  555 => 19가지

4: 5555

   & 1 ( + - * / ) 3 & 3 ( + - * / ) 1 & 2 ( + - * / ) 2 

5 : 5555

   & 1  ( + - * / ) 4 & 2 ( + - * / ) 3 & 3  ( + - * / ) 2 & 4  ( + - * / ) 1

 

따라서,

N = x 일 때

n : "x" * n +  1 [ + - * / ] (n-1) +  2 [ + - * / ] (n-2) + ... (n-1) [ + - * / ] 1

수식에 괄호 있어도 상관이 없다.

 

def solution(N, number):
	s = [set() for x in range(8)] 		# 중복 허용하지 않는 set 사용, N은 9 이하이기 때문에 최대 8까지의 계산 결과만 저장하면 됨
    
    for i, x in enumertate(s, start = 1):
    	x.add(int(str(N) * i))
        
   	for i in range(len(s)):
    	for j in range(i):
        	for op1 in s[j]:
            	for op2 in s[i - j - 1]:
                	#  + - * / 한 결과 집합 생성
                    s[i].add(op1 + op2)		
                    s[i].add(op1 - op2)
                    s[i].add(op1 * op2)
                    if op2 != 0:		# 0이 아닐경우에만 나누기
                    	s[i].add(op1 // op2)
		if number in s[i]:		# 원하는 숫자가 숫자를 i번 사용한 집합에 있으면
        	answer = i + 1		
            break
    else:		# Loop가 다 돌고도 없는 경우 -1 리턴
    	answer = -1
          	
    
    return number

어렵다

손코딩 꼭해봐야지

'알고리즘 > 커뮤러닝' 카테고리의 다른 글

[Python] 03-03 여행경로  (0) 2022.04.11
03-01 더 맵게_Heap  (0) 2022.04.11
02 체육복 - Greedy  (0) 2022.03.30
04 큰 수 만들기 - 탐욕법 (Greedy)  (0) 2022.03.29
03 가장 큰 수 - 풀이  (0) 2022.03.29