Skip to content

[Algorithm] 타겟 넘버 #164

Description

@hwangJi-dev

💬 문제

문제 설명

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 이하인 자연수입니다.

입출력 예

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

+4+1-2+1 = 4 +4-1+2-1 = 4

  • 총 2가지 방법이 있으므로, 2를 return 합니다.

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


💬 Idea

  • DFS를 이용하여 +, - 연산을 수행하자

    → 재귀함수 호출 방식을 사용하자!

  • 연산이 +, - 2가지 경우가 있으므로

    • sum(합계)를 구하기 위해
      • sum에 현재 number를 더하여 (+ 연산) dfs를 호출하고,
      • sum에 현재 number를 빼서(-연산) dfs를 호출한다.
    • 이렇게 모든 경우의 수에 +, - 연산을 수행하여 타겟 넘버에 도달하는 경우를 뽑아낼 수 있도록 재귀함수를 호출한다.
      • 재귀함수 종료 조건: index == numbers.count
      • 해당 시점에 sum(합계)과 target이 같다면 targetMadeCount를 + 1 해준다.

💬 풀이

import Foundation
vartargetMadeCount=0func solution(_ numbers:[Int], _ target:Int)->Int{dfsToFindTargetNumber(0, target, numbers,0)return targetMadeCount
}func dfsToFindTargetNumber(_ sum:Int, _ target:Int, _ numbers:[Int], _ idx:Int){if idx == numbers.count {if sum == target {
targetMadeCount +=1}return}dfsToFindTargetNumber(sum + numbers[idx], target, numbers, idx +1)dfsToFindTargetNumber(sum - numbers[idx], target, numbers, idx +1)}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions