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 함수를 작성해주세요.
numbers | target | return |
---|---|---|
[1, 1, 1, 1, 1] | 3 | 5 |
문제에 나온 예와 같습니다.
def DFS(numbers, target, tot):
if len(numbers) == 0:
if tot == target:
return 1
else:
return 0
else:
res = 0
res += DFS(numbers[:-1], target, tot + numbers[-1])
res += DFS(numbers[:-1], target, tot - numbers[-1])
return res
def solution(numbers, target):
answer = DFS(numbers, target, 0)
return answer
전형적인 DFS 문제이다.
나는 numbers
에서 마지막 원소부터 시작하였고, 재귀함수 호출할 때 여태 더한 값을 넘겨줘야 할 것 같아서 파라미터가 하나 더 있는 DFS
함수를 만들어 사용했다.
DFS함수를 호출할 때 마다 numbers
에서 원소 하나씩 빠지며, numbers
에 원소가 없으면 끝까지 다 실행한 것이므로 tot
와 target
을 비교하여 같다면 1, 같지 않으면 0을 리턴한다.
numbers
의 원소를 더한 경우와 뺀 경우 두가지가 있기에, DFS
함수를 두가지 방법으로 호출한다. 그리고 두번의 호출을 통해 받은 두 리턴값을 다시 리턴한다.
def solution(numbers, target):
if not numbers and target == 0 :
return 1
elif not numbers:
return 0
else:
return solution(numbers[1:], target-numbers[0]) + solution(numbers[1:], target+numbers[0])
solution
을 호출할 때, numbers
에서 빠지는 원소의 값만큼 target
에서 빼거나 더하여 호출한다. 이로써 내가 풀이한 코드에서의 tot
는 필요가 없어졌다.
내 코드에서 numbers
의 원소의 부호가 +이면 tot
에 더했는데, 이 코드에서는 target
에서 빼는 방식이다. 따라서 numbers
에 원소가 없고 target
이 0이면 조건이 모두 만족한 것이다. 조건이 모두 만족하면 1을 리턴, 그렇지 않으면 0을 리턴한다.
numbers
의 원소가 남아있다면 다시 재귀함수를 호출하는데, 원소값만큼 target
에 빼는경우와 더하는경우 두가지를 호출하여 받은 리턴값들을 더하여 다시 리턴한다.