본문 바로가기
> 알고리즘 문제 풀이/프로그래머스

*lv2-타겟 넘버 (python, 파이썬)

by bky373 2020. 10. 20.

- 1번: 내가 작성한 풀이

from collections import deque

def solution(numbers, target):
    total = sum(numbers)
    n = len(numbers)
    operators_list = deque()
    answer = 0

    get_operators([], operators_list, n)

    for operators in operators_list:
        res = total
        for i in range(n):
            if operators[i] == '-':
                res -= 2 * numbers[i]
        if res == target:
            answer += 1
    return answer

def get_operators(ops, operators_list, n):
    if len(ops) == n:
        operators_list.append(ops[:])
        return

    ops.append('+')
    get_operators(ops, operators_list, n)
    ops.pop()

    ops.append('-')
    get_operators(ops, operators_list, n)
    ops.pop()
    





- 2번: 1번 성공 후 참고한 풀이

def dfs(nums, i, n, target):
    ret = 0
    if i == len(nums):
        if n == target: return 1
        else: return 0
    ret += dfs(nums, i+1, n+nums[i], target)
    ret += dfs(nums, i+1, n-nums[i], target)
    return ret

def solution2(numbers, target):
    answer = dfs(numbers, 0, 0, target)
    return answer





- 확인하기!
 - 처음에 eval() 함수로 계산을 시도했지만 시간 초과가 나왔다. eval() 함수는 확실히 느리다..!
 - 위의 두개의 코드를 비교했을 때, 내가 작성한 코드가 성능면에서 많이 좋지 않았다.
   두번째 코드를 복기하며, 재귀함수에 대해 더 깊이 이해할 수 있었다.
   계속해서 재귀함수를 유연하게 활용하는 법에 대해 고민해봐야겠다. 
- 불필요한 할당은 배제하자!
  

댓글