숫자가 들어간 배열이 주어지는데 여기에서 숫자 세 개를 뽑아서 0이 되는 경우의 수를 구하는 문제다.
깊이 우선 탐색으로 숫자 세 개를 골라서 더한 다음에 0을 확인하는 방법으로 접근했다. 그러나 여기서 문제가 발생했는데, 숫자가 같고 순서가 다르면 서로 다른 값으로 인식해서 중복되는 값이 세진다는 것이다.
이걸 어떻게 해결해야 하지 고민하던 순간 파이썬에는 조합 모듈이 존재함을 떠올렸다.
조합 모듈 itertools.combinations을 이용했다. 먼저 조합을 만들고 해당 조합을 전부 더해서 0이 나오면 answer의 값을 하나 올려주는 방식이다.
import itertools
def solution(number):
nCr = itertools.combinations(number, 3)
answer = 0
for l in list(nCr):
tmp = 0
for s in l:
tmp = tmp + s
if tmp == 0:
answer = answer + 1
return answer
dfs로 파라미터를 넘길 때 합한 값을 넘기는 풀이가 있었다.
def solution(number):
tot = 0
def dfs(i, cnt, sum_num):
nonlocal tot
if cnt == 3 and not sum_num:
tot += 1
return
if i == len(number):
return
if cnt < 3:
dfs(i+1, cnt+1, sum_num + number[i])
dfs(i+1, cnt, sum_num)
dfs(0,0,0)
answer = tot
return answer