맛있는물회

[맛있는물회] <programmers 알고리즘> "타겟 넘버" 본문

IT/알고리즘

[맛있는물회] <programmers 알고리즘> "타겟 넘버"

맛있는물회 2020. 4. 15. 23:19

문제 조건


n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.

-1+1+1+1+1 = 3

+1-1+1+1+1 = 3

+1+1-1+1+1 = 3

+1+1+1-1+1 = 3

+1+1+1+1-1 = 3

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.

 

Input


  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

 

Output


 

생각한 아이디어

 

연산자의 개수와 N의 값이 그렇게 크지 않기 때문에 단순하게 순열 조합을 사용하자 라는 아이디어를 적용하였다.

 

순열이 필요한데 중복 순열이기 때문에 product라는 함수를 사용하였고 아주 간단하게 풀 수 있었다.

 

DFS로 푼다면 조금 생각할 부분이 꽤 있었겠지만 중복 순열 함수를 사용하여 아주 직관적으로 풀었다.

 

 

소스코드


from itertools import product
cnt = 0
def cal(numbers,op,target):
    global cnt
    sum = 0
    for i in range(0,len(numbers)):
        if op[i] == 0: #+
            sum += numbers[i]
        elif op[i] == 1: #-
            sum -= numbers[i]
    if sum == target:
        cnt+=1

def solution(numbers, target):
    op = [0,1]
    for val in product(op,repeat = len(numbers)):
        #print(val)
        cal(numbers,val,target)
    
    print(cnt)
    return cnt

 

*파이썬 문법 정리

Comments