λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
✨ Algorithm

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

by nitronium102 2021. 8. 24.

문제 μ„€λͺ…

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

 

μž…μΆœλ ₯ 예

numbers  target  return

[1, 1, 1, 1, 1] 3 5

 

풀이

DFS μ•Œκ³ λ¦¬μ¦˜μ„ ν™œμš©ν•œ λ¬Έμ œμ΄λ‹€.

  • sum = ν˜„μž¬ μ‹μ˜ ν•©(λͺ©ν‘œ : νƒ€κ²Ÿ λ„˜λ²„)
  • count = 주어진 숫자λ₯Ό μ‚¬μš©ν•œ 횟수

 

  • μ’…λ£Œ 쑰건 : countκ°€ 주어진 숫자의 κ°œμˆ˜μ™€ λ™μΌν•˜κ³ , sum이 νƒ€κ²Ÿ λ„˜λ²„μ™€ 같을 λ•Œ

sum + numbers[count]와 sum - numbers[count] 두 μ’…λ₯˜λ‘œ λ‚˜λˆ μ„œ λ‹€μ‹œ targetNumber ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€. (수λ₯Ό λ”ν•˜λŠ” 경우, λΉΌλŠ” 경우)

이 λ•Œ, countλŠ” 항상 μ¦κ°€ν•œλ‹€!!

#include <string>
#include <vector>

using namespace std;
int answer = 0;

void targetNumber(vector<int> numbers, int target, int sum, int count){
    if (count == numbers.size()){
        if (sum == target) answer++;
        return;
    }
    targetNumber(numbers, target, sum+numbers[count], count+1); // 였λ₯Έμͺ½
    targetNumber(numbers, target, sum-numbers[count], count+1); // μ™Όμͺ½
}

int solution(vector<int> numbers, int target) {
    targetNumber(numbers, target, 0, 0);
    return answer;
}

λŒ“κΈ€