ν‹°μŠ€ν† λ¦¬ λ·°

πŸ–₯ 문제

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 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

πŸ€” 풀이 방법

μƒκ°ν•΄λ³΄μž.

[1]둜 1을 λ§Œλ“œλŠ” 방법은 1 ν•œκ°€μ§€μ΄λ‹€.
[1, 1]둜 2λ₯Ό λ§Œλ“œλŠ” 방법은 1 + 1 ν•œ 가지이닀.
[1, 1, 1, 1, 1]둜 3을 λ§Œλ“œλŠ” 방법은 문제 μ„€λͺ…κ³Ό 같이 λ‹€μ„― 가지이닀.
[1, 1]둜 3을 λ§Œλ“€ 수 μ—†κΈ° λ•Œλ¬Έμ— 0개의 방법이 μžˆλ‹€.

깊이 μš°μ„  탐색을 μ§„ν–‰ν•œλ‹€.

깊이 μš°μ„  νƒμƒ‰μ΄λž€ 루트 λ…Έλ“œμ—μ„œλΆ€ν„° μ‹œμž‘ν•΄μ„œ λ‹€μŒ 브랜치둜 λ„˜μ–΄κ°€κΈ° 전에 ν•΄λ‹Ή 브랜치λ₯Ό μ™„λ²½ν•˜κ²Œ νƒμƒ‰ν•˜λŠ” 방법이닀.
n개의 μ •μˆ˜λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜μ—¬ νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“€μ—ˆμ„ λ•Œ answerλ₯Ό +1 ν•΄μ£Όκ³  λ¦¬ν„΄ν•˜μ˜€λ‹€.
n개의 μ •μˆ˜λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜μ˜€μ§€λ§Œ νƒ€κ²Ÿ λ„˜λ²„κ°€ λ§Œλ“€μ–΄μ§€μ§€ μ•Šμ€ 경우 μ¦‰μ‹œ λ¦¬ν„΄ν•˜μ—¬ 더이상 탐색을 μ§„ν–‰ν•˜μ§€ μ•Šλ„λ‘ λ°©μ§€ν•œλ‹€.

[1, 1]둜 2λ₯Ό λ§Œλ“œλŠ” 경우λ₯Ό 보면

-1-1λŠ” n개의 μ •μˆ˜λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜μ˜€μ§€λ§Œ νƒ€κ²Ÿ λ„˜λ²„κ°€ λ§Œλ“€μ–΄μ§€μ§€ μ•Šμ•˜λ‹€. 탐색을 μ’…λ£Œν•œλ‹€.
-1+1λŠ” n개의 μ •μˆ˜λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜μ˜€μ§€λ§Œ νƒ€κ²Ÿ λ„˜λ²„κ°€ λ§Œλ“€μ–΄μ§€μ§€ μ•Šμ•˜λ‹€. 탐색을 μ’…λ£Œν•œλ‹€.
+1-1λŠ” n개의 μ •μˆ˜λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜μ˜€μ§€λ§Œ νƒ€κ²Ÿ λ„˜λ²„κ°€ λ§Œλ“€μ–΄μ§€μ§€ μ•Šμ•˜λ‹€. 탐색을 μ’…λ£Œν•œλ‹€.
+1+1λŠ” n개의 μ •μˆ˜λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•˜μ—¬ νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“€μ—ˆλ‹€. answerλ₯Ό +1 ν•΄μ€€λ‹€.

λͺ¨λ“  탐색이 μ’…λ£Œλ˜μ—ˆκ³  닡은 1이 λœλ‹€.

πŸ‘©πŸ»β€πŸ’» Swift Code

import Foundation

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

func dfs(_ numbers: [Int], _ target: Int, _ currentNum: Int, _ index: Int, _ answer: inout Int, _ str: String) {
    if target == currentNum && index == numbers.count {
        answer += 1
        return
    }

    if index >= numbers.count {
        return
    }

    dfs(numbers, target, currentNum - numbers[index], index + 1, &answer, str + "-\(numbers[index])")
    dfs(numbers, target, currentNum + numbers[index], index + 1, &answer, str + "+\(numbers[index])")
}

 

 

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - νƒ€κ²Ÿ λ„˜λ²„

n개의 음이 μ•„λ‹Œ μ •μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 수λ₯Ό 적절히 λ”ν•˜κ±°λ‚˜ λΉΌμ„œ νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“€λ €κ³  ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ [1, 1, 1, 1, 1]둜 숫자 3을 λ§Œλ“€λ €λ©΄ λ‹€μŒ λ‹€μ„― 방법을 μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€. -1+1+1+1+1 = 3 +1-1+1+1+

programmers.co.kr

 

λŒ“κΈ€
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2025/04   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
κΈ€ 보관함