ํ๊ฒ ๋๋ฒ
๋ฌธ์
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๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ๋๋์ฐ.
Comment