πŸ’†πŸ»β€β™‚οΈ ν”Ό-μ—μŠ€/🐣 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[μŠ€μœ„ν”„νŠΈ μ•Œκ³ λ¦¬μ¦˜] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€: νƒ€κ²Ÿ λ„˜λ²„

κ°œλ°œν•˜λŠ” ν›ˆμ΄ 2021. 7. 31. 23:40

문제

문제 μ„€λͺ…

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 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

풀이

dfs 둜 ν•œλ²ˆ κΉŠμ΄κ°€ λ‚΄λ €κ°ˆ λ•Œλ§ˆλ‹€ 숫자λ₯Ό λΉΌλŠ” 경우, 숫자λ₯Ό λ”ν•˜λŠ” 경우λ₯Ό μƒˆλ‘œμš΄ μž¬κ·€λ‘œ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€. λ°˜ν˜Έλ‚˜ 값은 μƒμ„±λœ 값이 νƒ€κ²Ÿ λ„˜λ²„κ°€ λ˜λŠ”μ§€ ν™•μΈν•˜μ—¬ 맞으면 1 , μ•„λ‹ˆλ©΄ 0을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 이λ₯Ό λͺ¨λ‘ λ”ν•˜λ©΄ νƒ€κ²Ÿλ„˜λ²„λ₯Ό λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  경우의 수λ₯Ό μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ

import Foundation

func dfs(_ index : Int, _ numbers : inout [Int], _ sum : Int, _ target : Int) -> Int{
    if index == numbers.count {
        return sum == target ? 1 : 0
    }
    return dfs(index + 1, &numbers, sum + numbers[index], target)
            + dfs(index + 1, &numbers, sum - numbers[index], target)
}

func solution(_ numbers:[Int], _ target:Int) -> Int {
    var nums = numbers
    return dfs(0, &nums, 0, target)
}