Contents

νƒ€κ²Ÿ λ„˜λ²„ (with.Java)

   Sep 26, 2024     2 min read

νƒ€κ²Ÿ λ„˜λ²„ (with.Java) 에 λŒ€ν•˜μ—¬ μ•Œμ•„λ³Έ κΈ€μž…λ‹ˆλ‹€.

μ½”λ”© ν…ŒμŠ€νŠΈ 문제λ₯Ό ν’€λ©°, ν’€μ—ˆλ˜ λ¬Έμ œμ— λŒ€ν•œ νšŒκ³ μ™€ λ‹€λ₯Έ 풀이 방법을 μ•Œμ•„λ³΄λ©°, μ•Œμ•„κ°€κ³ μž ν•©λ‹ˆλ‹€.

λ¬Έμ œμ— λŒ€ν•΄ λ¨Όμ € μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

문제

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

μž…μΆœλ ₯ 예

numberstargetreturn
[1, 1, 1, 1, 1]35
[4, 1, 2, 1]42

문제 풀이

class Solution {
    static int answer;
    public int solution(int[] numbers, int target) {
        answer = 0;
        dfs(numbers, target, 0, 0);
        return answer;
    }
    public void dfs(int[] numbers, int target, int depth, int total){
        if(numbers.length == depth){
            if(total == target){
                answer++;
            }
        }else{
            dfs(numbers, target, depth + 1, total + numbers[depth]);
            dfs(numbers, target, depth + 1, total - numbers[depth]);
        }
    }
}

풀이 μ„€λͺ…

  1. ν΄λž˜μŠ€μ™€ λ³€μˆ˜ μ„ μ–Έ class Solution: 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. static int answer: 정적 λ³€μˆ˜ answerλŠ” νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“€ 수 μžˆλŠ” 경우의 수λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
  2. solution λ©”μ„œλ“œ public int solution(int[] numbers, int target): 주어진 숫자 λ°°μ—΄ numbers와 λͺ©ν‘œ 숫자 target을 μž…λ ₯으둜 λ°›μ•„ νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“€ 수 μžˆλŠ” 경우의 수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. answer = 0: 경우의 수λ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. dfs(numbers, target, 0, 0): 깊이 μš°μ„  탐색을 μ‹œμž‘ν•©λ‹ˆλ‹€. 초기 κΉŠμ΄λŠ” 0, 초기 합계도 0으둜 μ„€μ •ν•©λ‹ˆλ‹€. return answer: μ΅œμ’…μ μœΌλ‘œ κ³„μ‚°λœ 경우의 수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  3. dfs λ©”μ„œλ“œ public void dfs(int[] numbers, int target, int depth, int total): 깊이 μš°μ„  탐색을 μˆ˜ν–‰ν•˜λŠ” μž¬κ·€ λ©”μ„œλ“œμž…λ‹ˆλ‹€. if(numbers.length == depth): λ°°μ—΄μ˜ 끝에 λ„λ‹¬ν–ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. if(total == target): ν˜„μž¬ 합계 total이 λͺ©ν‘œ 숫자 targetκ³Ό κ°™μœΌλ©΄ 경우의 수λ₯Ό μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€. else: λ°°μ—΄μ˜ 끝에 λ„λ‹¬ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ‹€μŒ λ‹¨κ³„λ‘œ λ„˜μ–΄κ°‘λ‹ˆλ‹€. dfs(numbers, target, depth + 1, total + numbers[depth]): ν˜„μž¬ 숫자λ₯Ό λ”ν•œ 경우λ₯Ό νƒμƒ‰ν•©λ‹ˆλ‹€. dfs(numbers, target, depth + 1, total - numbers[depth]): ν˜„μž¬ 숫자λ₯Ό λΊ€ 경우λ₯Ό νƒμƒ‰ν•©λ‹ˆλ‹€.

κ²°λ‘ 

이 μ½”λ“œλŠ” DFSλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  κ°€λŠ₯ν•œ 경우λ₯Ό νƒμƒ‰ν•˜κ³ , λͺ©ν‘œ μˆ«μžμ™€ μΌμΉ˜ν•˜λŠ” 경우의 수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

주어진 숫자 λ°°μ—΄κ³Ό λͺ©ν‘œ μˆ«μžκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 μ½”λ“œλ₯Ό 톡해 νƒ€κ²Ÿ λ„˜λ²„λ₯Ό λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  경우의 수λ₯Ό 효율적으둜 ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.