Data miner

#Dynamic_programming #예시문제

carayoon 2019. 9. 14. 17:01
728x90

변수 세 개를 받아서, 최대 수익을 구하는 함수 만들기

그 세 개의 변수란, 1) 판매 개수에 따른 매출에 대한 리스트. 즉, 리스트의 인덱스가 판매 개수이며 리스트의 실제값은 인덱스값만큼 판매하였을 때의 매출액에 해당한다. 2) 판매하고자 하는 제품의 개수 3) 특정 개수 별 최대 매출액이 저장되어 있는 딕셔너리

이 문제 또한 앞서 소개한 두 개의 전략처럼, Memoization과  Tabulation 각각의 전략으로 접근 가능하다. 

먼저 #Memoization인 경우 다음과 같이 풀 수가 있다. 

def max_profit_cache(p_of_list, n, cache):
	#만약, 판매n의 개수가 0이거나 1인 경우에는 price_list에 있는 것을  
    #그대로 리턴하면 된다. 단, 이 값또한  cache에 저장하는 것을 잊지말자*(내가 놓친 부분)
    
    if n < 2:
    	cache[n] = p_of_list[n]
    
    if n in cache:
    	return cache[n] #계산한 값이 cache에 있을 경우 그대로 리턴하면 된다. 
    
    else:
    	cache[n] = max_profit_cache(p_of_list, n-1, cache) + max_profit_cache(p_of_list, 1, cache)
        
    	for i range (1, n//2+1): 가능한 모든 경우의 수를 생각해야 하므로,
        	temp = max_profit_cache(p_of_list, i, cache) + max_profit_cache(p_of_list, n-i, cache)
            
            if temp > cache[n]:
            	cache[n] = temp
     	if n < len(p_of_list):
        	cache[n] < p_of_list[n]:
            	cache[n] = p_of_list[n]
    
    return cache[n]
    
#실제 최대 매출액을 구하는 함수, 들어가는 인자는 price_list와 n
def max_profit(p_of_list, n):
	max_cache = {} #저장하는 딕셔너리 생성
    
    return max_profit_cache(p_of_list, n, cache)
            
        
        

 

다른 풀이와 비교해봤을 때, 파이썬의 max 함수를 사용한 경우도 있었다.

max()는 여러 값들의 나열중에서 최대값을 리턴해주는 함수이다. (리스트나 값 자체들을 나열한 것도 받는다)

p_of_list에 포함되는 값인 경우 range(1, n//2+1)의 조합값들과 비교하여 max값으로 최종값으로 산출하였다.