์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋ฐฑ์ค€(BOJ)] 1182๋ฒˆ: ๋ถ€๋ถ„์ˆ˜์—ด์˜ ํ•ฉ (๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking), C++)

PROGRAMMING/Algorithm

by koharin 2021. 2. 5. 02:15

๋ณธ๋ฌธ

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ป C++ ์ œ์ถœ์ฝ”๋“œ


#include <stdio.h>
#include <deque>

using namespace std;
int count=0;

void solution(int sum, int index, int target, deque<int> *arr){

    sum += (*arr)[index];

    if(index == (*arr).size()) return;
    if(sum == target) count++;
    
    solution(sum - (*arr)[index], index+1, target, arr);
    solution(sum, index+1, target, arr);
}

int main(){
    int N, S; // N: ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜, S: ํ•ฉ

    scanf("%d %d", &N, &S);

    deque<int> arr;

    for(int i=0; i<N; i++){
        int num;
        scanf("%d", &num);
        arr.push_back(num);
    }
    
    solution(0, 0, S, &arr); // sum, index, target sum, arr
    printf("%d", count);
    
}

 

 

๐Ÿ“ ๋ฌธ์ œํ’€์ด ๊ณผ์ •


  • DFS(sum - arr[index], index + 1)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, sum += arr[index]๋ฅผ ํ•˜๊ณ  arr[index]๋ฅผ ๋นผ๋ฏ€๋กœ ํ˜„์žฌ ์›์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. 

  • ์ฒ˜์Œ์—๋Š” sum์ด -7 / -3 / -2 / 5 / 8 ์ด๋ ‡๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ , index = 5์ผ ๋•Œ๋Š” arr[index]์—์„œ๋ถ€ํ„ฐ, index != 5๊นŒ์ง€ sum์— ๋”ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ 8 / 5 / 5 8 / -2 / -2 5 / -2 5 8 / ... ์ด๋ ‡๊ฒŒ arr[index]๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

 

WRONG!!!

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค..

index == N์ผ ๋•Œ๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด์•ผ ์ด๋•Œ ์•„์˜ˆ ๋‚˜๊ฐ€๋Š”๋ฐ, ์ด๋ฏธ sum == S ์ธ ์ƒํƒœ์—์„œ ๋˜ ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ ๋˜์–ด count์— ๋˜ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฑธ ๊ณ„์† ๋ชฐ๋ผ์„œ 20๋ฒˆ ์ œ์ถœํ•˜๊ณ ์„œ์•ผ ๋งž์•˜๋‹ค... ๐Ÿ˜ฃ

index == N์€ ์ •๋‹ต์ด ๋  ์ˆ˜ ์—†๋Š” ์กฐ๊ฑด์ด๋ฏ€๋กœ ๋ฆฌํ„ด์„ ์‹œ์ผœ ๋ฏธ๋ฆฌ ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ํ•˜๋Š” ์ด๊ฒƒ์ด ๋ฐฑํŠธ๋ž˜ํ‚น์ธ ๊ฒƒ์ด๋‹ค. 

 

 

๐Ÿ‘ ๊ฒฐ๊ณผ


  • ์ฝ”๋“œ์—์„œ ํ•˜๋‚˜์”ฉ ์ฐ์–ด๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ, DFS/BFS๋ณด๋‹ค๋Š” ์‹œ๊ฐ„ ๋ฉด์—์„œ ํšจ์œจ์ ์ด์ง„ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค. (๋” ํšจ์œจ์ ์œผ๋กœ ์งœ๋ฉด ๊ดœ์ฐฎ์•„์งˆ๊นŒ๐Ÿค”)

728x90
๋ฐ˜์‘ํ˜•

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ