[c++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค :: ํƒ€๊ฒŸ๋„˜๋ฒ„ (brute force, ๋ฌธ์ œ ํ’€์ด, ์ฝ”๋“œ)

ํƒ€๊ฒŸ ๋„˜๋ฒ„

๋ฌธ์ œ

https://programmers.co.kr/learn/courses/30/lessons/43165

๋ฌธ์ œ ์„ค๋ช…

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

์ฝ”๋“œ

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int bruteForce(int num, vector<int>& numbers, int target){
    // num : +์˜ ๊ฐฏ์ˆ˜
    int size = numbers.size();
    int answer = 0;
    vector<int> tmp(size, -1); // tmp๋Š” 1๊ณผ -1๋งŒ ์กด์žฌํ•˜๋Š” ๋ฐฐ์—ด
    for(int i=0; i<num; i++){
        tmp[size-1-i]=1; // -1์ด 1๋ณด๋‹ค ๋จผ์ € ์™€์•ผ next_permutation์ด ๋™์ž‘ํ•จ
    }
    do{
        int sum=0;
        for(int i=0; i<size; i++){
            sum+= numbers[i]*tmp[i];
        }
        if(sum==target)
            answer++;
    }while(next_permutation(tmp.begin(),tmp.end()));
    return answer;
}

int solution(vector<int> numbers, int target) {
    int answer = 0;
    int size = numbers.size();
    sort(numbers.begin(), numbers.end());

    vector<int> range;

    for(int i=1; i<=size; i++){ // +์˜ ๊ฐฏ์ˆ˜
        int max =0; int min =0;
        for(int j=0; j<i; j++){ 
            max += numbers[size-1-j]; // sort๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ถ€ํ„ฐ + ์ฃผ๊ธฐ
            min += numbers[j]; // sort๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ถ€ํ„ฐ + ์ฃผ๊ธฐ
        }
        for(int j=i; j<numbers.size(); j++){ // ๋‚˜๋จธ์ง€๋Š” -
            max -= numbers[size-1-j];
            min -= numbers[j];
        }
        if(target>=min && target<=max)
            range.push_back(i); // target number๊ฐ€ ๋ฒ”์œ„ ์•ˆ์— ์†ํ•˜๋ฉด ํ›„๋ณด์— ๋„ฃ๊ธฐ
    }

    for(int i=0; i<range.size(); i++)
        answer += bruteForce(range[i], numbers, target);

    return answer;
}

 

ํ’€์ด

 ์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ์ˆซ์ž๋ฅผ ์ค„ ์„ธ์šด ํ›„์— +, -๋ฅผ ๋ผ์›Œ๋„ฃ๊ฑฐ๋‚˜, ๋ชจ๋“  ์ˆซ์ž์˜ +, - ํ•œ ์ˆ˜๋“ค์„ ์ค„ ์„ธ์šฐ๊ฑฐ๋‚˜ ํ•˜๋Š” brute force ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ˆซ์ž์˜ ๊ฐฏ์ˆ˜๊ฐ€ 20๊ฐœ๊นŒ์ง€๋„ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ brute force๋ฅผ ์“ด๋‹ค๋ฉด 2^20์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฐ๋‹นํ•ด์•ผํ–ˆ๋‹ค. brute force๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ์ค„์ด๋ฉด ๊ดœ์ฐฎ์ง€ ์•Š์„๊นŒ?

 ๋ณธ์ธ์€ +์˜ ๊ฐฏ์ˆ˜๋กœ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ„๊ธฐ๋กœ ํ–ˆ๋‹ค. +๊ฐ€ n๊ฐœ์ผ ๋•Œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€, ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•œ ํ›„ target ์ˆซ์ž๊ฐ€ ๊ทธ ๋ฒ”์œ„ ์•ˆ์— ์†ํ•œ๋‹ค๋ฉด ํ•ด๋‹น +์˜ ๊ฐฏ์ˆ˜๋ฅผ ์กฐ์‚ฌํ•˜๊ธฐ๋กœ ํ•œ ๊ฒƒ์ด๋‹ค.

 ๋”ฐ๋ผ์„œ ์ฒ˜์Œ์— ๋‚˜์˜จ for๋ฌธ์—์„œ ํ›„๋ณด๊ฐ€ ๋˜๋Š” +์˜ ๊ฐฏ์ˆ˜๋ฅผ ์กฐ์‚ฌํ•˜์˜€๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” size๋งŒํผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋‚ด๋ถ€ ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋˜ size๋งŒํผ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— 20^2=400 ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 ๊ทธ ํ›„์— ํ›„๋ณด์ธ ์ˆ˜๋“ค์„ ๋„˜๊ฒจ์„œ ์ˆœ์—ด๋กœ ์กฐ์‚ฌํ•˜๋ฉด์„œ target ์ˆซ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€๋ฅผ bruteForce ํ•จ์ˆ˜๋กœ ๊ณ„์‚ฐํ•˜์˜€๋‹ค. ์šฐ์„  tmp๋ผ๋Š” numbers์™€ ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ฐ™์€ ๋ฐฐ์—ด์„ ๋ชจ๋‘ -1๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€ ๋‹ค์Œ, ๋„˜๊ฒจ๋ฐ›์€ +์˜ ๊ฐฏ์ˆ˜๋งŒํผ ๋’ค์—์„œ๋ถ€ํ„ฐ 1๋กœ ์ฑ„์›Œ์ค€๋‹ค.

์ฒ˜์Œ์— ์—ฌ๊ธฐ์—์„œ ์‹ค์ˆ˜๋ฅผ ํ•ด์„œ [1,1,1,1,-1] ๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ 1์„ ๋จผ์ € ์ฑ„์›Œ์คฌ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์ง„ํ–‰ํ•˜๋ฉด next_permutation ํ•จ์ˆ˜๊ฐ€ ๋Œ์ง€ ์•Š๋Š”๋‹ค.

[-1,1,1,1,1] ๊ณผ ๊ฐ™์ด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ ์–ด์ค˜์•ผํ•œ๋‹ค.

 ๊ทธ๋ฆฌ๊ณ  tmp ๋ฐฐ์—ด์˜ ์ˆœ์—ด์— ๋”ฐ๋ผ numbers์— ๊ณฑํ•ด์ค€ ๋‹ค์Œ ๋”ํ•ด์„œ target ์ˆซ์ž์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

 

์ฑ„์  ๊ฒฐ๊ณผ

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> numbers, int target) {
    int answer = 0;
    int size = 1 << numbers.size();

    for(int i = 1 ; i < size ; i++){ //2^20
        // 1๋ถ€ํ„ฐ ์ญ‰ ์กฐ์‚ฌ
        // 1, 10, 11, 100, ...
        // 1์ด ์žˆ๋Š” index๊ฐ€ -์ธ number

        int temp = 0;
        for(int j = 0 ; j < numbers.size() ; j++)
        {  
            if(i &(1 << j)){
                temp -= numbers[j];
            }
            else temp += numbers[j];
        }
        if(temp == target) answer++;
    }
    return answer;
}

bit mask๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. ๋˜‘๋˜‘์“ฐ.

๋ฐ˜์‘ํ˜•