본문 바로가기

PS/프로그래머스

[프로그래머스-DFS/BFS] 타겟 넘버_파이썬 ❌❌

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


answer = 0

def dfs(idx, numbers, target, value):
    global answer
    l = len(numbers)
    
    if idx == l and value == target:
        answer += 1
        return
    if idx == l:
        return
    
    dfs(idx+1, numbers, target, value+numbers[idx])
    dfs(idx+1, numbers, target, value-numbers[idx])

def solution(numbers, target):
    global answer
    dfs(0, numbers, target, 0)
    return answer

def solution(numbers, target):
    if not numbers and target == 0 :
        return 1
    elif not numbers:
        return 0
    else:
        a = solution(numbers[1:], target-numbers[0])
        b = solution(numbers[1:], target+numbers[0])
        return a + b

코딩 테스트를 준비할 때 나를 제일 힘들게 하는 것은 '재귀'다.

단순히 보이는 코드는 짧은데, 내부적으로는 수많은 연산을 하기 때문에 도통 이해하기가 힘들다.

때문에, 새로운 유형의 문제를 만날 때마다 머리털 빠지게 고민을 하는데, 이게 여간 힘든 것이 아니다.

코드 몇 줄을 가지고 몇 시간을 끙끙대다 보면, 자연스레 내 사고력을 원망하게 되고 자존감 하락으로 이어진다.

하지만 그렇다고 포기한다면, 내 의지력까지 원망하게 될 것이다. 그건 싫다. 정말 싫다.

어짜피 피할 수 없다. 재귀가 편해지는 날이 올 때까지 달려보자.