πŸ“• Algorithm/Solved

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] νƒ€κ²Ÿ λ„˜λ²„ (Javascript)

ν•œμ½”λ”© 2021. 1. 12. 15:19
728x90
728x90

문제 μ„€λͺ…

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, 1, 1, 1, 1] 3 5

μž…μΆœλ ₯ 예 μ„€λͺ…

λ¬Έμ œμ— λ‚˜μ˜¨ μ˜ˆμ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

function solution(numbers, target) {
    var answer = 0;
    recur(0, 0);
    return answer;

    // μž¬κ·€ν•¨μˆ˜ ν˜•νƒœμ˜ DFS κ΅¬ν˜„
    function recur(cnt, sum){
        
        // numbers의 λͺ¨λ“  수λ₯Ό μ—°μ‚°ν•˜κ³ , targetκ³Ό 같은 합이 λ‚˜μ˜€λ©΄ answer증가
        if(cnt === numbers.length){
            if(sum === target)
                answer++;
            return
        }

        // + , - μ—°μ‚° λͺ¨λ‘ μˆ˜ν–‰
        recur(cnt+1, sum+numbers[cnt]);
        recur(cnt+1, sum-numbers[cnt]);
    }
}

 

문제의 μ„€λͺ…이 λΆ€μ‘±ν•΄μ„œ 많이 해멨닀. μ™œλƒν•˜λ©΄, μž…λ ₯ μ˜ˆμ œμ—μ„œ [1, 1, 1, 1, 1]이 μˆœμ„œλŒ€λ‘œ μ§€μΌœμ Έμ•Ό ν•˜λŠ”μ§€ μ•„λ‹Œμ§€μ˜ μ—¬λΆ€κ°€ μ •ν™•νžˆ λͺ…μ‹œλ˜μ–΄ μžˆμ§€ μ•Šμ•˜λ‹€. κ·Έλž˜μ„œ 'μˆœμ„œκ°€ μ€‘μš”ν•˜μ§€ μ•Šμ€' ν˜•νƒœλ‘œ 문제λ₯Ό μ ‘κ·Όν•˜μ—¬ 였랜 μ‹œκ°„μ— ν•΄κ²°ν–ˆμœΌλ‚˜ 빨간색 μ‹€νŒ¨κ°€ 와λ₯΄λ₯΄ 생겼닀. μ£Όμ‹μ΄μ—ˆμœΌλ©΄ 빨간색이 λ°˜κ°‘κ² μ§€λ§Œ 아쉽닀. λ”°λΌμ„œ, 'μˆœμ„œκ°€ μ€‘μš”ν•œ' ν˜•νƒœλ‘œ κ΅¬ν˜„ν•˜μ˜€λ‹€. 

 

numbers λ°°μ—΄μ˜ μ›μ†Œλ₯Ό DFSλ₯Ό 톡해 합을 κ΅¬ν•˜λ„λ‘ κ΅¬ν˜„ν•˜μ˜€λ‹€. μ•„λž˜λŠ” μ˜ˆμ‹œμ΄λ‹€. 

 

0        1         2

                -> +1

      -> +1

                -> -1

0              

                -> +1

      -> -1

                -> -1  .....  

 

 

μ΄λŸ¬ν•œ ν˜•νƒœλ‘œ κ³„μ†ν•΄μ„œ λ”ν•΄μ§€λŠ” 깊이 μš°μ„  탐색을 μž¬κ·€ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•˜μ˜€λ‹€.

 

μ’…λ£Œ μ‘°κ±΄μœΌλ‘œλŠ” cntκ°€ numbers의 길이만큼 μˆ˜ν–‰ν–ˆλ‹€λŠ” 것은 λͺ¨λ“  μ›μ†Œλ₯Ό μ—°μ‚°ν–ˆλ‹€λŠ” 것이고, λ˜ν•œ targetκ³Ό λͺ¨λ‘ μ—°μ‚°λœ sum이 κ°™λ‹€λ©΄ answerλ₯Ό μ¦κ°€ν•˜λŠ” 방식이닀. 

 

문제λ₯Ό ν’€λ‹€κ°€ λ‹Ήν™©μŠ€λŸ¬μš΄ μ—λŸ¬κ°€ μžˆμ—ˆλ‹€. 

 

μœ„ μ†ŒμŠ€μ½”λ“œμ—μ„œ μž¬κ·€ν•¨μˆ˜ 호좜 λΆ€λΆ„μ—μ„œ cnt+1을 cnt++둜 ν–ˆμ„ λ•Œ λ°œμƒν•œ μ—λŸ¬μ˜€λ‹€. 

 

μ—λŸ¬ λ°œμƒ 원인은 cnt++을 μ‚¬μš©ν•˜λ©΄ cntκ°€ 2이면 λ‹€μŒ μž¬κ·€ ν•¨μˆ˜μ—λŠ” 3을 인자둜 μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”λ°, ++후연산을 μ‚¬μš©ν•˜κ²Œ 되면 cntκ°€ 2둜 인자둜 μ‚¬μš©λœ ν›„ 3으둜 μ¦κ°€λ˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ, numbers.lengthλŠ” 5인데, cntκ°€ 6κΉŒμ§€ 연산을 μˆ˜ν–‰ν•˜λ €ν•΄μ„œ 인덱슀 접근에 였λ₯˜κ°€ λ°œμƒν•œ 것이닀. 

728x90
λ°˜μ‘ν˜•