본문으로 바로가기

[프로그래머스] 타겟 넘버

category Algorithms/Programmers 2021. 9. 5. 16:10

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

  

문제 설명


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

-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.

  

  

제한 설명


  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

  

  

입출력 예


numbers target return
[ 1, 1, 1, 1, 1] 3 5

  

  

풀이


numbers의 각 수가 +일 때와 - 일 때의 모든 경우의 수를 전부 탐색하는 완전 탐색을 이용하여 풀 수 있다. 이때 완전 탐색은 재귀 - DFS로 푼다.

 

  • target에 numbers의 모든 수를 뺐을 때(마지막 인덱스까지 갔을 때), 0이 나온다면 이는 타켓넘버가 될 수 있다. 이때 numbers의 값을 차례대로 얻기 위해 index를 이용한다. 타겟 넘버가 되었을 때는 카운트를 하기 위해 1을 리턴하고, 안되었다면 0을 리턴한다.

ex) numbers = [1, 2, 3]이고 target이 6일 때 target -1 -2 -3 = 0으로 +1 +2 +3은 타켓 넘버가 될 수 있다.

if index == len(numbers) - 1:
    if T == 0:
        return 1
    else:
        return 0

  

  • 재귀는 두 가지로 호출한다.
  1. number: +일 때,  dfs(target - (+number))
  2. number: -일 때,  dfs(target - (-number))
dfs(index + 1, T - numbers[index])
dfs(index + 1, T + numbers[index])

 

  • 최종 dfs 함수
def dfs(index, T):
    if index == len(numbers) - 1:
        if T == 0:
            return 1
        else:
            return 0
    return dfs(index + 1, T - numbers[index]) + dfs(index + 1, T + numbers[index])

   

   

전체 코드


def solution(numbers, target):
    def dfs(index, T):
        if index == len(numbers) - 1:
            if T == 0:
                return 1
            else:
                return 0
        return dfs(index + 1, T - numbers[index]) + dfs(index + 1, T + numbers[index])

    return dfs(-1, target)


if __name__ == "__main__":
    numbers	= [1, 1, 1, 1, 1]
    target = 3
    print(solution(numbers, target))