프로그래머스 level 2- 타겟 넘버
Computer Science/알고리즘(백준+프로그래머스)

프로그래머스 level 2- 타겟 넘버

https://programmers.co.kr/learn/courses/30/lessons/43165

 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+

programmers.co.kr

 

# Idea

주어진 배열 numbers는 순서대로 더하거나 빼야하고, 이 과정을 그려보면 Tree로 표현됨을 알 수 있다.

: (Edge를 +or - 로 표현하고, 각 노드들을 결과 값으로 표현한다)

따라서 Tree를 끝까지 순회해서 결과가 Target과 같은 경우의 수를 구하면 되며, 이는 DFS로 풀릴 수 있다.

 

# 나의 풀이

def solution(numbers, target):
    answer = 0
    n=len(numbers)
    def dfs(idx,result):
        if idx==n: #끝에 다다르면 종료
            if result==target:
                nonlocal answer #함수 안의 변수를 사용하기 때문에 지역변수가 아님을 처리해줘야한다.
                answer+=1
            return
        dfs(idx+1,result-numbers[idx])
        dfs(idx+1,result+numbers[idx])
    
    dfs(0,0)    
    return answer

: numbers 안의 원소들을 모두 더하거나 뺄때까지 재귀를 진행하고, 이 결과가 target하고 같은 경우에는 answer의 경우의 수를 더했으며, 다른 경우에는 그냥 return하였다.

: tree가 끝에 다다르면 1+1+1+1+1, 1+1+1+1-1.. 등의 결과가 나오게 되고, 이 값을 target하고 비교하면 된다. 

 

+) 재귀/ 트리 순회 참고 포스팅

https://velog.io/@polynomeer/%EC%9E%AC%EA%B7%80Recursion

 

재귀(Recursion)

가능한 방법을 전부 만들어 보는 알고리즘 들을 가리켜 '완전 탐색(exhaustive search)' 라고 부른다. 손으로 직접 풀기에는 경우의 수가 너무 많은 경우, 완전 탐색은 (컴퓨터의 처리속도를 이용하여)

velog.io