1. 문제
https://programmers.co.kr/learn/courses/30/lessons/43165
2. 풀이
2.1. dfs를 이용한 문제 풀이
- 아래와 같이 dfs를 이용하여 모든 경우의 수를 전부 체크합니다. 최대 경우의 수가 $ 2^{20} $ 밖에 되지 않아서 쉽게 처리할 수 있습니다.
answer = 0
def dfs(numbers, target, depth, num_sum):
global answer
if depth == len(numbers):
if target == num_sum :
answer += 1
return
dfs(numbers, target, depth + 1, num_sum + numbers[depth])
dfs(numbers, target, depth + 1, num_sum - numbers[depth])
def solution(numbers, target):
dfs(numbers, target, 0, 0)
return answer
2.2. 재귀를 이용한 풀이
- 프로그래머스의 숏코딩으로 전역변수를 이용하지 않고 효과적으로 문제를 푼 풀이입니다.
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])
2.3. 곱집합(Cartesian product) 이용한 풀이
# 두 스트링 'ABCD', 'xy' 의 곱집합 : Ax Ay Bx By Cx Cy Dx Dy
import itertools
iterable1 = 'ABCD'
iterable2 = 'xy'
itertools.product(iterable1, iterable2)
- 곱집합(Cartesian product)에 대한 개념과 예시는 위와 같고, 더욱 더 자세한 설명은 프로그래머스 곱집합 에 나와있습니다.
- 프로그래머스의 짧은 코드는 아래와 같습니다.
- itertools 패키지에서 product 함수에 *l 을 이용하여 (-n, n) 형태의 튜플들을 인자로 넣어주면, 아래와 같은 형태의 값을 얻을 수 있습니다.
- product(*l) 함수를 sum 을 이용하여 값을 모두 더해주고 target과 비교하여 정답을 도출합니다.
list(product(*l))
00 = {tuple: 5} (1, 2, 3, 4, 5)
01 = {tuple: 5} (1, 2, 3, 4, -5)
02 = {tuple: 5} (1, 2, 3, -4, 5)
03 = {tuple: 5} (1, 2, 3, -4, -5)
04 = {tuple: 5} (1, 2, -3, 4, 5)
05 = {tuple: 5} (1, 2, -3, 4, -5)
06 = {tuple: 5} (1, 2, -3, -4, 5)
07 = {tuple: 5} (1, 2, -3, -4, -5)
08 = {tuple: 5} (1, -2, 3, 4, 5)
09 = {tuple: 5} (1, -2, 3, 4, -5)
10 = {tuple: 5} (1, -2, 3, -4, 5)
11 = {tuple: 5} (1, -2, 3, -4, -5)
12 = {tuple: 5} (1, -2, -3, 4, 5)
...
from itertools import product
def solution(numbers, target):
l = [(x, -x) for x in numbers]
s = list(map(sum, product(*l)))
return s.count(target)
2.3.
PREVIOUS[프로그래머스] 행렬의 곱셈 풀이