Algorithm

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

bba_dda 2020. 9. 21. 12:26
λ°˜μ‘ν˜•

문제 μ„€λͺ…

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

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

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

풀이

  • value :계산 κ°’
  • index : numbersλ°°μ—΄μ˜ λͺ‡λ²ˆμ§Έ 수 κΉŒμ§€ μ΄μš©ν–ˆλŠ”μ§€
  • value에 numbers[index]λ₯Ό λ”ν•˜κ±°λ‚˜ λΊ€ 값을 dfs둜 탐색.
  • numbersλ°°μ—΄μ˜ 수λ₯Ό λͺ¨λ‘ μ΄μš©ν•˜κ³ , value==target인 κ²½μš°μ— answer+1
#include <string>
#include <vector>

using namespace std;
int len; // numbers의 길이 (μ΄μš©ν•  수 μžˆλŠ” 숫자 개수)
int answer = 0;

//dfsν•¨μˆ˜(μž¬κ·€) 
void dfs(int index, int value, int target, vector<int> numbers){
    if (index == len){ //numbers의 숫자λ₯Ό λͺ¨λ‘ μ΄μš©ν•΄μ„œ
        if (value == target) //targetκ³Ό 같은 숫자λ₯Ό λ§Œλ“€μ—ˆλ‹€λ©΄
            answer ++; 
        return; 
    }
    //value에 numbers[index]λ₯Ό λ”ν•˜κ±°λ‚˜ λΊ€ 값을 dfs둜 탐색 
    dfs(index + 1, value + numbers[index],target,numbers);
    dfs(index + 1, value - numbers[index],target,numbers);
}
int solution(vector<int> numbers, int target) {
    len = numbers.size();
    dfs(0,0,target,numbers);
    return answer;
}
λ°˜μ‘ν˜•