*제출코드
all = [] #주어진 숫자를 모두 조합(더하기,빼기)해서 나올수 있는 값을 기록
sum = 0 #파라미터로 넘기지 않고 두 함수에서 쓰기위해 전역으로 선언
arr = [] # "
def dfs(index):
global all , arr, sum
sum += arr[index] #이전까지 기록된 sum에 해당 인덱스의 값을 더한다
if index == len(arr)-1: #맨마지막 원소까지 더한 것이라면
all.append(sum) #값을 기록한다
else:
dfs(index+1) #아니라면 다음 인덱스로 이동한다
sum -= arr[index] #sum에 더했던 인덱스 값을 원상복귀 시켜준다
sum -= arr[index] #이전까지 기록된 sum에서 해당 인덱스의 값을 뺀다
if index == len(arr)-1:
all.append(sum)
else:
dfs(index+1)
sum += arr[index] #sum에서 뺐던 인덱스 값을 원상복귀 시켜준다
def solution(numbers, target):
global arr
arr= numbers
dfs(0)
answer = all.count(target) #나온 값 중에서 target number와 일치하는 값의 개수를 센다.
return answer
*review
0. 가능한 모든 조합을 구해야해서 dfs로 풀었다.
1. 처음 시도는 dfs로 풀 방법을 찾다보니 그래프 구조를 dictionary로 짰던 것이 기억나서 딕셔너리 구조로 풀려 했다.
예를들어 [2,3,5] 의 numbers가 입력되었을 때
2라는 값에서 더하거나 뺄 수 있는 것은 3이라는 값이고,
3이라는 값에서 덧셈뺄셈을 할 수 있는것은 5라는 값이라고 생각해서
방향 그래프 {2:[3],3:[5],5:[]} 로 구조를 짜고 코드를 짰다.
그런데 테스트 케이스 [1,1,1,1]에는 적용되지 않는 구조였다.
파이썬 dictionary는 중복된 키 값을 허용하지 않기 때문이다.
2. 생각해보니 굳이 dictionary로 하지 않고 list로 해도 됐다. 현재 인덱스에서 갈 수 있는 곳은 다음 인덱스 뿐이기 때문이다.
마지막 인덱스에 도착했을 때만 최종 sum값을 기록해주고, 마지막 인덱스가 아니라면 다음인덱스로 갈 수 있도록 재귀적으로 함수를 짜주었다.
'Algorithm > Programmers' 카테고리의 다른 글
| [프로그래머스] 전화번호 목록 (0) | 2020.03.24 |
|---|---|
| [프로그래머스] 가장 큰 수 (0) | 2020.03.11 |
| [프로그래머스] 이분탐색 - 예산 (0) | 2020.03.04 |
| [프로그래머스] 정렬 -k번째 수 (0) | 2020.02.05 |