๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โœจ 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;
}

๋Œ“๊ธ€