전체 코드는 다음과 같다
def solution(numbers, target):
answer = 0
result = [0]
for number in numbers:
temp_sum = []
for res in result:
temp_sum.append(res + number)
temp_sum.append(res - number)
result = temp_sum
for i in result:
if i == target: answer += 1
print(answer)
return answer
numbers
: 사용할 수 있는 숫자가 담긴 배열 target
: numbers
안에 배열의 수를 적절히 더하거나 빼서 도달하는 타겟 넘버입력을
numbers=[3 1 2 5 4]
,target=5
라고 가정 하면 조합의 모든 경우는[-3 1 -2 5 4]
,[3 -1 2 5 -4]
,[3 1 2 -5 4]
이다.따라서 출력은 3이 나와야 한다.
numbers = [ 3, 1, 2, 5, 4]
, target = 5
가정한다.
numbers
의 원소마다 +, -를 붙여서
result
배열에 저장하기를 반복한다.
numbers = 3
👉result = [+3, -3]
numbers = 1
👉result = [+3+1, +3-1, -3+1, -3-1]
numbers = 2
👉result = [+3+1+2,+3+1-2, +3-1+2,+3-1-2, -3+1+2,-3+1-2, -3-1+2,-3-1-2]
.........
numbers = 4
👉result = 모든 BFS 경우의 합
해당 result
배열의 원소 중에서 target
과 일치하는 원소가 있을때마다 answer
에 +1을 해준다.
answer = 0
result = [0]
for number in numbers:
temp_sum = []
for res in result:
temp_sum.append(res + number)
temp_sum.append(res - number)
result = temp_sum
answer
: 출력 결과가 저장될 변수
result = [0]
: 모든 조합의 합들이 저장될 배열, 초기값은 0이다.
temp_sum=[]
: 해당 배열은 number
가 바뀔때마다 초기화
temp_sum.append(res +/-number)
: numbers
의 원소마다 +, -
를 붙여서 result
배열에 저장
for i in result:
if i == target: answer += 1
print(answer)
return answer
target
과 일치하는 result
의 원소가 존재하면 answer + 1
하고 answer
을 출력한다.
if __name__ == '__main__':
solution([1, 1, 1, 1, 1], 3) #5
solution([1, 1, 1, 1, 1, 1], 2) #15
solution([3, 2, 1, 5, 4], 5) #3
순서대로 5, 15, 3
이 출력된다.
테스트 1 〉 통과 (169.24ms, 50.1MB)
테스트 2 〉 통과 (185.00ms, 49.4MB)
테스트 3 〉 통과 (0.16ms, 10.2MB)
테스트 4 〉 통과 (0.81ms, 10.3MB)
테스트 5 〉 통과 (5.11ms, 11.2MB)
테스트 6 〉 통과 (0.33ms, 10.3MB)
테스트 7 〉 통과 (0.17ms, 10.2MB)
테스트 8 〉 통과 (1.26ms, 10.5MB)
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])
테스트 1 〉 통과 (366.10ms, 10.2MB)
테스트 2 〉 통과 (384.23ms, 10.2MB)
테스트 3 〉 통과 (0.57ms, 10.3MB)
테스트 4 〉 통과 (2.75ms, 10.2MB)
테스트 5 〉 통과 (19.72ms, 10.2MB)
테스트 6 〉 통과 (0.74ms, 10.2MB)
테스트 7 〉 통과 (0.59ms, 10.2MB)
테스트 8 〉 통과 (5.81ms, 10.2MB)
재귀호출의 방식을 사용했기 때문에 시간적인 면에서는 느리다. 하지만 재귀호출 방식에 대해 공부도 할 겸 코드를 분석해봤다.
return solution(numbers[1:], target-numbers[0])
+ solution(numbers[1:], target+numbers[0])
이 부분이 핵심이면서 내 코드와 유사한 점이라고 생각한다.
target
에서 numbers
의 첫 번째 원소만큼 빼고/더하면서 numbers = numbers[1:]
이 된다.
if not numbers and target == 0 :
return 1
elif not numbers:
return 0
그러다 numbers
가 마지막 원소까지 가게된다면,
해당 상태에서 target
이 0 이면 answer +=1
아니라면
answer += 0
이라고 할 수 있다.